day07-1MySQL約束

来源:https://www.cnblogs.com/liyuelian/archive/2022/10/07/16766583.html
-Advertisement-
Play Games

MySQL約束 基本介紹 約束用於確保資料庫的數據滿足特定的商業規則 在mysql中,約束包括:not null,unique,primary key,foreign key 和check 5種 1.primary key(主鍵) 欄位名 欄位類型 primary key 用於唯一地標識表行的數據, ...


MySQL約束

  • 基本介紹

約束用於確保資料庫的數據滿足特定的商業規則

在mysql中,約束包括:not null,unique,primary key,foreign key 和check 5種

1.primary key(主鍵)

欄位名 欄位類型 primary key

用於唯一地標識表行的數據,當定義主鍵約束之後,該列不能重覆

  • 細節說明
  1. primary key不能重覆而且不能為null
  2. 一張表最多只能有一個主鍵,但是可以是複合主鍵
  3. 主鍵的指定方式有兩種
    • 直接在欄位名後面指定:欄位名 primary key
    • 在表定義最後寫 primary key(列名)
  4. 使用desc 表名,可以看到primary key的情況
  5. 在實際開發中,每一張表往往都會設計一個主鍵

例子

-- 主鍵的使用

-- id	name 	email
CREATE TABLE t17(
	id INT PRIMARY KEY, -- 表示id列是主鍵
	`name` VARCHAR(32),
	email VARCHAR(32)
);
INSERT INTO t17 VALUES(1,'jack','[email protected]');
INSERT INTO t17 VALUES(2,'tom','[email protected]');


-- 1. primary key不能重覆而且不能為null
INSERT INTO t17 VALUES(NULL,'jack','[email protected]');-- 插入失敗,Column 'id' cannot be null

-- 2. 一張表最多只能有一個主鍵,但是可以是複合主鍵(比如id+name)
-- 演示覆合主鍵
CREATE TABLE t18(
	id INT, 
	`name` VARCHAR(32),
	email VARCHAR(32),
	PRIMARY KEY(id,`name`) -- 這裡就是複合主鍵
);

INSERT INTO t18 VALUES(1,'tom','[email protected]'); -- ok
INSERT INTO t18 VALUES(1,'jack','[email protected]');-- OK
INSERT INTO t18 VALUES(1,'tom','[email protected]'); -- false
SELECT * FROM t18;

-- 3. 主鍵的指定方式有兩種
--  3.1直接在欄位名後面指定:欄位名 primary key
CREATE TABLE t19(
	id INT PRIMARY KEY, 
	`name` VARCHAR(32),
	email VARCHAR(32)
);

--  3.2在表定義最後寫 primary key(列名)
CREATE TABLE t20(
	id INT, 
	`name` VARCHAR(32),
	email VARCHAR(32),
	PRIMARY KEY(id) 
);

-- 4. 使用desc 表名,可以看到primary key的情況
DESC t20; -- 查看t20的情況,顯示約束的情況

2.not null(非空)

如果在列上定義了not null,那麼當插入數據時,必須為列提供數據

欄位名 欄位類型 not null

3.unique(唯一)

當定義了唯一約束後,該列值是不能重覆的

欄位名 欄位類型 unique
  • unique細節
  1. 如果沒有指定not null,則unique欄位可以有多個null
  2. 一張表可以有多個unique欄位
-- unique的使用

CREATE TABLE t21(
	id INT UNIQUE, -- 表示id列不可重覆 
	`name` VARCHAR(32),
	email VARCHAR(32)
)
INSERT INTO t21 VALUES(1,'jack','[email protected]'); -- ok
INSERT INTO t21 VALUES(1,'tom','[email protected]');  -- false,Duplicate entry '1' for key 'id'

-- unique細節

-- 1. 如果沒有指定not null,則unique欄位可以有多個null
-- 如果一個列(欄位),是 unique not null 則使用效果類似 primary key
INSERT INTO t21 VALUES(NULL,'tom','[email protected]');-- ok
SELECT * FROM t21;

-- 2. 一張表可以有多個unique欄位
CREATE TABLE t22(
	id INT UNIQUE, -- 表示id列不可重覆 
	`name` VARCHAR(32) UNIQUE, -- 表示name也不可以重覆
	email VARCHAR(32)
)
DESC t22;

4.foreign key(外鍵)

  • foreign key(外鍵)

用於定義主表和從表之間的關係:

外鍵約束要定義在從表上,主表則必須具有主鍵約束或是unique約束。

當定義外鍵約束後,要求外鍵列數據必須在主表的主鍵列存在或是為null

  • 語法
foreign key(本表欄位名) references 主表名(主鍵名或unique欄位名)

例子

-- 外鍵演示
-- 創建 主表 my_class
CREATE TABLE my_class(
	id INT PRIMARY KEY, -- 班級編號
	`name` VARCHAR(32) NOT NULL DEFAULT ''
);

-- 創建從表 my_stu
CREATE TABLE my_stu(
	id INT PRIMARY KEY,-- 學生編號
	`name` VARCHAR(32) NOT NULL DEFAULT '',
	class_id INT, -- 學生所在的班級的編號
	-- 下麵指定外鍵關係
	FOREIGN KEY(class_id) REFERENCES my_class(id)
);

-- 測試數據
INSERT INTO my_class VALUES(100,'java'),(200,'web');
INSERT INTO my_class VALUES(300,'php');
SELECT * FROM my_class;

INSERT INTO my_stu VALUES(1,'tom',100);
INSERT INTO my_stu VALUES(2,'jack',200);
INSERT INTO my_stu VALUES(3,'hsp',300); 
INSERT INTO my_stu VALUES(4,'mary',400); -- 失敗,因為400號班級不存在

SELECT * FROM my_stu;
  • 外鍵細節說明
  1. 外鍵指向的主表的欄位,要求是primary key 或是unique
  2. 表的類型是innodb,這樣的表才支持外鍵
  3. 外鍵欄位的類型要和主鍵欄位的類型一致(長度可以不同)
  4. 外鍵欄位的值,必須在主鍵欄位中出現過,或者為null [前提是外鍵欄位允許為null]
  5. 一旦建立主外鍵的關係,數據就不能隨意刪除了

5.check

  • check

用於強制行數據必須滿足的條件。假定在sal列上定義了check約束,並要求sal列值在1000~2000之間,如果不在此範圍,就會提示出錯

提示:oracle和sql server均支持check,但是mysql5.7目前還不支持check,只做語法校驗,但不會生效

  • 語法
列名 類型 check(check條件)

在mysql中實現check的功能,一般是在程式中控制或者通過觸發器完成

例子

-- 演示check的使用
-- 目前mysql5.7還不支持check,只做語法校驗但不會生效

-- 測試
CREATE TABLE t23(
	id INT PRIMARY KEY,
	`name` VARCHAR(32),
	sex VARCHAR(6) CHECK(sex IN('man','woman')),
	sal DOUBLE CHECK(sal >1000 AND sal<2000)
); 

6.練習

商店售貨系統表設計案例

現有一個商店的資料庫shop_db,記錄客戶及其購物情況,由下麵三個表組成:

  • 商品表 goods
    • 商品號 goods_id
    • 商品名 goods_name
    • 單價 unitprice
    • 商品類別 category
    • 供應商 provider
  • 客戶表 customer
    • 客戶號 customer_id
    • 姓名 name
    • 住址 address
    • 電郵 email
    • 性別 sex
    • 身份證 card_Id
  • 購買表 purchase
    • 購買訂單號 order_id
    • 客戶號 customer_id
    • 商品號 goods_id
    • 購買數量 nums

建表,在定義中要求聲明[進行合理設計]

  1. 每個表的主外鍵
  2. 客戶的姓名不能為空值
  3. 電郵不能夠重覆
  4. 客戶的性別[男|女]
  5. 單價unitprice在1.0~9999.99之間
-- 使用約束的課堂練習

-- 1,創建資料庫
CREATE DATABASE shop_db;

-- 2,商品表 goods
CREATE TABLE goods(
	 goods_id INT PRIMARY KEY, -- 商品號
	 goods_name VARCHAR(64) NOT NULL DEFAULT '', -- 商品名
	 unitprice DECIMAL(10,2) NOT NULL DEFAULT 0 -- 單價
		CHECK(unitprice BETWEEN 1.0 AND 9999.99), 
	 category INT NOT NULL DEFAULT 0, -- 商品類別
	 provider VARCHAR(64) NOT NULL DEFAULT '' -- 供應商
);

-- 3,客戶表 customer
CREATE TABLE customer(
	 customer_id CHAR(8) PRIMARY KEY, -- 客戶號
	 `name` VARCHAR(64) NOT NULL DEFAULT '', -- 姓名
	 address VARCHAR(64) NOT NULL DEFAULT '', -- 地址
	 email VARCHAR(64) UNIQUE NOT NULL, -- 電郵
	 sex ENUM('男','女') NOT NULL, -- 使用枚舉類型,性別
	 card_Id CHAR(18)  -- 身份證
);

-- 4,購買表 purchase
CREATE TABLE purchase(
	 order_id INT PRIMARY KEY, -- 訂單號
	 customer_id CHAR(8) NOT NULL DEFAULT '', -- 客戶號
	 goods_id INT NOT NULL DEFAULT 0, -- 商品號
	 num INT NOT NULL DEFAULT 0, -- 購買數量 
	FOREIGN KEY(customer_id) REFERENCES  customer(customer_id),
	FOREIGN KEY(goods_id) REFERENCES  goods(goods_id)
);

DESC goods;
DESC customer;
DESC purchase;
image-20221007174116878 image-20221007174053112 image-20221007174233666

7.自增長

  • 語法
欄位名 整型 primary key auto_increment

例子:在某張表中,存在一個id列(整數)

我們希望在添加記錄的時候,該列從1開始自動地增長,應該怎麼處理?

-- 自增長演示
-- 創建表
CREATE TABLE t24(
	id INT PRIMARY KEY AUTO_INCREMENT,
	email VARCHAR(32) NOT NULL DEFAULT '',
	`name` VARCHAR(32) NOT NULL DEFAULT ''
);

DESC  t24;
-- 測試自增長的使用

INSERT INTO t24 VALUES(NULL,'[email protected]','jack');
INSERT INTO t24 VALUES(NULL,'[email protected]','tom');
INSERT INTO t24(email,`name`) VALUES('[email protected]','hsp');
SELECT * FROM t24;
image-20221007180523019 image-20221007175725172
  • 自增長使用細節
  1. 一般來說自增長是和primary key配合使用的

  2. 自增長也可以單獨使用 [但是需要配合一個unique]

  3. 自增長修飾的欄位為整數型(雖然小數也可以但是很少這樣使用)

  4. 自增長預設從1開始,也可以通過如下命令來修改

    alter table 表名 auto_increment = xxx;
    
  5. 如果添加數據時候,給自增長欄位(列)指定有值,則以指定的值為準。一旦指定了值,下一次自增長就會以指定的值開始增長。因此,如果指定了自增長,一般來說就按自增長的規則來添加數據

-- 修改預設的自增長開始值
CREATE TABLE t25(
	id INT PRIMARY KEY AUTO_INCREMENT,
	email VARCHAR(32) NOT NULL DEFAULT '',
	`name` VARCHAR(32) NOT NULL DEFAULT ''
);
ALTER TABLE t25 AUTO_INCREMENT =100;
INSERT INTO t25 VALUES(NULL,'[email protected]','jack');
-- 指定值
INSERT INTO t25 VALUES(666,'[email protected]','hsp');
-- 一旦指定了值,下一次自增長就會以指定的值開始增長
INSERT INTO t25 VALUES(NULL,'[email protected]','marry');
SELECT * FROM t25;
image-20221007183314672
您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 一、CentOS 7.9 安裝 Jenkins 2.361.2 1 下載地址:https://www.jenkins.io/download 2 簡介 Jenkins是一個Java開發的開源持續集成工具,廣泛用於項目開發,具有自動化構建、測試和部署等功能,它的運行需要Java環境。 二、Jenkin ...
  • 一、CentOS 7.9 安裝 nginx-1.22.0 下載地址:http://nginx.org/en/download.html 2 安裝前的準備 # 操作系統內核版本 uname -a # 操作系統發行版本 cat /etc/redhat-release 在安裝Nginx之前,我們需要確保全 ...
  • Arnold 是一款先進的蒙特卡洛光線追蹤渲染器,專為動畫長度和視覺效果的需求而打造。C4DtoA 4.4.0 使用 Arnold 7.1.3.1 , 是一個功能版本,帶來了對 Cinema 4D 2023 中 OCIO 顏色管理的支持、對 OSL 元數據支持的改進和一些錯誤修複。不再支持 Cine ...
  • 關於 LOAD segment with RWX permissions 警告, 這是 Binutils 2.39 引入的一個新的安全類型的警告, GCC在升級版本時會帶著新版本的 Binutils 一起發佈. 如果要消除這個警告, 要麼修改ld文件, 要麼屏蔽掉它. ...
  • KVM虛擬化 虛擬化介紹 虛擬化:在一臺電腦上虛擬出多個邏輯的電腦,而且每個邏輯電腦 它可以是不同操作系統 虛擬化技術:可以擴大硬體容量,單個cpu模擬出多個cpu並行, 允許一個平臺上同時運行多個操作系統,應用程式都可以在相互獨立 的空間內運行,而且互不影響。 為什麼企業使用虛擬化技術 1、 ...
  • 想象你的電腦上跑著機器學習,但是你又想聽歌,但是你的電腦只有一個CPU,如果把所有的CPU資源都拿去跑機器學習的話,你必須等程式跑完之後才能聽歌。但是現實是,你可以在機器學習程式運行的時候放著自己喜歡的歌,甚至還可以打開微信聊天。這就是操作系統一個很重要的功能,那就是操作系統需要支持多個進程同時 ...
  • 痞子衡嵌入式半月刊: 第 64 期 這裡分享嵌入式領域有用有趣的項目/工具以及一些熱點新聞,農曆年分二十四節氣,希望在每個交節之日準時發佈一期。 本期刊是開源項目(GitHub: JayHeng/pzh-mcu-bi-weekly),歡迎提交 issue,投稿或推薦你知道的嵌入式那些事兒。 上期回顧 ...
  • 事務 四大屬性 1,原子性:事務是一個完整的整體,要麼都執行,要麼都不執行 2,一致性:當事務完成時,數據必須處於一致狀態 3,隔離性:對數據修改的所有併發事務是彼此隔離的,即事務必須是獨立的,不應以任何方式依賴於或影響其他 4,永久性:事務完成後,對資料庫的操作永久保留 事務控制 BEGIN:開始 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...