
文章目錄
- 📑前言
- 一. 約束概述
- 二. 約束演示
- 三. 外鍵約束
- 3.1 介紹
- 3.2 語法
- 3.3 刪除/更新行為
- 🌤?全篇總結

📑前言
數據庫中的約束是確保數據完整性和準確性的重要手段。通過對數據表字段的約束設置,可以限制數據的取值范圍、確保數據的唯一性以及建立表與表之間的關聯關系。本文將深入介紹MySQL中的各種約束類型及其使用方法,包括非空約束、唯一約束、主鍵約束、默認約束、檢查約束和外鍵約束,以及如何在創建表和修改表時添加約束,以及外鍵約束的相關知識。
一. 約束概述
概念:約束是作用于表中字段上的規則,用于限制存儲在表中的數據。
目的:保證數據庫中數據的正確、有效性和完整性。
分類:
約束 | 描述 | 關鍵字 |
---|---|---|
非空約束 | 限制該字段的數據不能為null | NOT NULL |
唯一約束 | 保證該字段的所有數據都是唯一、不重復的 | UNIQUE |
主鍵約束 | 主鍵是一行數據的唯一標識,要求非空且唯一 | PRIMARY KEY |
默認約束 | 保存數據時,如果未指定該字段的值,則采用默認值 | DEFAULT |
檢查約束(8.0.16版本 之后) | 保證字段值滿足某一個條件 | CHECK |
外鍵約束 | 用來讓兩張表的數據之間建立連接,保證數據的一致 性和完整性 | FOREIGN KEY |
注意:約束是作用于表中字段上的,可以在創建表/修改表的時候添加約束 。
二. 約束演示
如何在創建表、修改表的時候來指定約束呢,接下來我們就通過一個案例,來演示一下。
字段名 | 字段含 義 | 字段類型 | 約束條件 | 約束關鍵字 |
---|---|---|---|---|
id | ID唯一 標識 | int | 主鍵,并且自動增長 | PRIMARY KEY, AUTO_INCREMENT |
name | 姓名 | varchar(10) | 不為空,并且唯一 | NOT NULL , UNIQUE |
age | 年齡 | int | 大于0,并且小于等 于120 | CHECK |
status | 狀態 | char(1) | 如果沒有指定該值, 默認為1 | DEFAULT |
gender | 性別 | char(1) | 無 |
對應的建表語句為:
CREATE TABLE tb_user(id int AUTO_INCREMENT PRIMARY KEY COMMENT 'ID唯一標識',name varchar(10) NOT NULL UNIQUE COMMENT '姓名' ,age int check (age > 0 && age <= 120) COMMENT '年齡' ,status char(1) default '1' COMMENT '狀態',gender char(1) COMMENT '性別'
);
在為字段添加約束時,我們只需要在字段之后加上約束的關鍵字即可,需要關注其語法。我們執行上面的SQL把表結構創建完成,然后接下來,就可以通過一組數據進行測試,從而驗證一下,約束是否可以生效。
insert into tb_user(name,age,status,gender) values ('Tom1',19,'1','男'),
('Tom2',25,'0','男');
insert into tb_user(name,age,status,gender) values ('Tom3',19,'1','男');
insert into tb_user(name,age,status,gender) values (null,19,'1','男');
insert into tb_user(name,age,status,gender) values ('Tom3',19,'1','男');
insert into tb_user(name,age,status,gender) values ('Tom4',80,'1','男');
insert into tb_user(name,age,status,gender) values ('Tom5',-1,'1','男');
insert into tb_user(name,age,status,gender) values ('Tom5',121,'1','男');
insert into tb_user(name,age,gender) values ('Tom5',120,'男');
三. 外鍵約束
3.1 介紹
外鍵:用來讓兩張表的數據之間建立連接,從而保證數據的一致性和完整性。
我們來看一個例子:
左側的emp表是員工表,里面存儲員工的基本信息,包含員工的ID、姓名、年齡、職位、薪資、入職日期、上級主管ID、部門ID,在員工的信息中存儲的是部門的ID dept_id,而這個部門的ID是關聯的部門表dept的主鍵id,那emp表的dept_id就是外鍵,關聯的是另一張表的主鍵。
注意:
目前上述兩張表,只是在邏輯上存在這樣一層關系;在數據庫層面,并未建立外鍵關聯,所以是無法保證數據的一致性和完整性的。
3.2 語法
添加外鍵
CREATE TABLE 表名(字段名 數據類型,...[CONSTRAINT] [外鍵名稱] FOREIGN KEY (外鍵字段名) REFERENCES 主表 (主表列名)
);
ALTER TABLE 表名 ADD CONSTRAINT 外鍵名稱 FOREIGN KEY (外鍵字段名)REFERENCES 主表 (主表列名) ;
刪除外鍵
ALTER TABLE 表名 DROP FOREIGN KEY 外鍵名稱;
3.3 刪除/更新行為
添加了外鍵之后,再刪除父表數據時產生的約束行為,我們就稱為刪除/更新行為。具體的刪除/更新行為有以下幾種:
行為 | 說明 |
---|---|
NO ACTION | 當在父表中刪除/更新對應記錄時,首先檢查該記錄是否有對應外鍵,如果有則不 允許刪除/更新。 (與 RESTRICT 一致) 默認行為 |
RESTRICT | 當在父表中刪除/更新對應記錄時,首先檢查該記錄是否有對應外鍵,如果有則不 允許刪除/更新。 (與 NO ACTION 一致) 默認行為 |
CASCADE | 當在父表中刪除/更新對應記錄時,首先檢查該記錄是否有對應外鍵,如果有,則 也刪除/更新外鍵在子表中的記錄。 |
SET NULL | 當在父表中刪除對應記錄時,首先檢查該記錄是否有對應外鍵,如果有則設置子表 中該外鍵值為null(這就要求該外鍵允許取null)。 |
SET DEFAULT | 父表有變更時,子表將外鍵列設置成一個默認的值 (Innodb不支持) |
具體語法為:
ALTER TABLE 表名 ADD CONSTRAINT 外鍵名稱 FOREIGN KEY (外鍵字段) REFERENCES 主表名 (主表字段名) ON UPDATE CASCADE ON DELETE CASCADE;
🌤?全篇總結
本文詳細介紹了MySQL中的各種約束類型及其語法,包括約束的概念、分類、使用方法和外鍵約束的相關知識。通過學習本文,讀者可以掌握如何在數據庫設計和管理中靈活運用約束,從而保證數據的完整性和準確性,提高數據庫的穩定性和安全性。