約束
約束是作用于表中字段上的滥壕,可以在創(chuàng)建表/修改表的時候添加約束责球。
約束 | 描述 | 關(guān)鍵字 |
---|---|---|
非空約束 | 限制該字段的數(shù)據(jù)不能為 | null NOT NULL |
唯一約束 | 保證該字段的所有數(shù)據(jù)都是唯一询筏、不重復(fù)的 | UNIQUE |
主鍵約束 | 主鍵是一行數(shù)據(jù)的唯一標識,要求非空且唯一 | PRIMARY KEY |
默認約束 | 保存數(shù)據(jù)時,如果未指定該字段的值,則采用默認值 | DEFAULT |
檢查約束(8.0.16版本之后) | 保證字段值滿足某一個條件 | CHECK |
外鍵約束 | 用來讓兩張表的數(shù)據(jù)之間建立連接真友,保證數(shù)據(jù)的一致性和完整性 | FOREIGN KEY |
create table tb_user(
-- id 主鍵,并且自動增長
-- name 不為空紧帕,并且唯一
-- age 大于0盔然,并且小于等于120
-- status 如果沒有指定該值,默認為1
id int auto_increment primary key comment 'ID唯一表示',
name varchar(10) not null unique comment '姓名',
age int check ( age > 0 and age <=120 ) comment '年齡',
status char(1) default '1' comment '狀態(tài)',
gender char(1) comment '性別'
);
# 下面兩句效果一樣
insert into tb_user(name,age,gender) values ('Tom77',120,null,'男');
insert into tb_user(name,age,gender) values ('Tom77',120,'男');
# 由于添加命令中沒有指定id,系統(tǒng)會自動分配id,從1開始愈案,如果中間添加數(shù)據(jù)時出錯挺尾,該命令會占用一個id,即id將會不連續(xù)刻帚。
外鍵約束
外鍵:用來讓兩張表的數(shù)據(jù)之間建立連接,從而保證數(shù)據(jù)的一致性和完整性
添加外鍵
# 1
CREATE TABLE 表名(
字段名 數(shù)據(jù)類型,
...
[CONSTRAINT] [外鍵名稱] FOREIGN KEY (外鍵字段名) REFERENCES 主表 (主表列名)
);
# 2
ALTER TABLE 表名 ADD CONSTRAINT 外鍵名稱 FOREIGN KEY (外鍵字段名)
REFERENCES 主表 (主表列名) ;
# 為emp表的dept_id字段添加外鍵約束,關(guān)聯(lián)dept表的主鍵id
alter table emp add constraint fk_emp_dept_id foreign key (dept_id) references dept(id);
刪除外鍵
# 刪除emp表的外鍵fk_emp_dept_id
alter table emp drop foreign key fk_emp_dept_id;
刪除/更新行為
添加了外鍵之后涩嚣,再刪除父表數(shù)據(jù)時產(chǎn)生的約束行為崇众,我們就稱為刪除/更新行為。具體的刪除/更新行為有以下幾種
行為 | 說明 |
---|---|
NO ACTION | 當(dāng)在父表中刪除/更新對應(yīng)記錄時航厚,首先檢查該記錄是否有對應(yīng)外鍵顷歌,如果有則不允許刪除/更新。 (與 RESTRICT 一致) 默認行為 |
RESTRICT | 當(dāng)在父表中刪除/更新對應(yīng)記錄時幔睬,首先檢查該記錄是否有對應(yīng)外鍵眯漩,如果有則不允許刪除/更新。 (與 NO ACTION 一致) 默認行為 |
CASCADE | 當(dāng)在父表中刪除/更新對應(yīng)記錄時麻顶,首先檢查該記錄是否有對應(yīng)外鍵赦抖,如果有,則也刪除/更新外鍵在子表中的記錄辅肾。 |
SET NULL | 當(dāng)在父表中刪除對應(yīng)記錄時队萤,首先檢查該記錄是否有對應(yīng)外鍵,如果有則設(shè)置子表中該外鍵值為null(這就要求該外鍵允許取null)矫钓。 |
SET DEFAULT | 父表有變更時要尔,子表將外鍵列設(shè)置成一個默認的值 (Innodb不支持) |
ALTER TABLE 表名 ADD CONSTRAINT 外鍵名稱 FOREIGN KEY (外鍵字段) REFERENCES 主表名 (主表字段名) ON UPDATE CASCADE ON DELETE CASCADE;
# cascade
# 父表改動,子表相應(yīng)改動(父表刪除部分數(shù)據(jù)新娜,子表相應(yīng)部分整行都會被刪除)
alter table emp add constraint fk_emp_dept_id foreign key (dept_id) references dept(id) on update cascade on delete cascade ;
# SET NULL
# 父表改動赵辕,子表相應(yīng)改動(父表刪除部分數(shù)據(jù),子表相應(yīng)部分數(shù)據(jù)會變成null)
alter table emp add constraint fk_emp_dept_id foreign key (dept_id) references dept(id) on update set null on delete set null ;