一匪燕、約束基本概念
約束:指對(duì)表中數(shù)據(jù)的一種約束蕾羊,能夠幫助數(shù)據(jù)庫管理員更好地管理數(shù)據(jù)庫喧笔,并且能夠確保數(shù)據(jù)庫中數(shù)據(jù)的有效性和一致性。
主要存在的6種約束:
1龟再、主鍵約束
主鍵約束(Primary Key Constraint)是使用最頻繁的約束书闸,一般要求每個(gè)表中設(shè)置一個(gè)主鍵,主鍵是表的一個(gè)特殊字段利凑,該字段能唯一標(biāo)識(shí)該表中的每條信息浆劲。
1)列級(jí)用法:
<字段名> <數(shù)據(jù)類型> PRIMARY KEY [AUTO_INCREMENT]
通過給字段添加 AUTO_INCREMENT 屬性來實(shí)現(xiàn)主鍵自增長。
- 默認(rèn)情況下哀澈,AUTO_INCREMENT 的初始值是 1梳侨,每新增一條記錄,字段值自動(dòng)加 1日丹。
- 一個(gè)表中只能有一個(gè)字段使用 AUTO_INCREMENT 約束走哺,且該字段必須有唯一索引,以避免序號(hào)重復(fù)(即為主鍵或主鍵的一部分)哲虾。
- AUTO_INCREMENT 約束的字段必須具備 NOT NULL 屬性丙躏。
- AUTO_INCREMENT 約束的字段只能是整數(shù)類型(TINYINT、SMALLINT束凑、INT晒旅、BIGINT 等)。
- AUTO_INCREMENT 約束字段的最大值受該字段的數(shù)據(jù)類型約束汪诉,如果達(dá)到上限废恋,AUTO_INCREMENT 就會(huì)失效。
表中存在AUTO_INCREMENT屬性的列后扒寄,才能修改AUTO_INCREMENT初始值
ALTER TABLE <表名> AUTO_INCREMENT=<初始值>
插入數(shù)據(jù)時(shí)出現(xiàn)唯一鍵沖突或手動(dòng)設(shè)置了自增字段的值鱼鼓,則會(huì)出現(xiàn),自增字段值不連續(xù)的情況该编。
2)表級(jí)用法:
1個(gè)表只可擁有1個(gè)主鍵迄本,主鍵約束名固定為PRIMARY
,自定義約束名不會(huì)生效
PRIMARY KEY (字段1,...)
3)修改表時(shí)添加主鍵約束
#列級(jí)約束
ALTER TABLE <表名> MODIFY COLUMN <字段名> <數(shù)據(jù)類型> PRIMARY KEY [AUTO_INCREMENT];
#表級(jí)約束
ALTER TABLE <表名> ADD PRIMARY KEY (<字段名>);
4)修改表時(shí)刪除主鍵約束
不支持MODIFY COLUMN
刪除主鍵約束
ALTER TABLE <表名> DROP PRIMARY KEY;
OR
ALTER TABLE <表名> DROP CONSTRAINT `PRIMARY`;
2课竣、唯一約束
唯一約束(Unique Key Constraint)是指所有記錄中字段的值不能重復(fù)出現(xiàn)嘉赎。
1)列級(jí)用法
<字段名> <數(shù)據(jù)類型> UNIQUE
2)表級(jí)用法
[CONSTRAINT <約束名>] UNIQUE(<列名1>,...);
3)修改表時(shí)添加唯一約束
#列級(jí)約束
ALTER TABLE <表名> MODIFY COLUMN <字段名> <數(shù)據(jù)類型> UNIQUE;
#表級(jí)約束
ALTER TABLE <表名> ADD [CONSTRAINT <約束名>] UNIQUE (<字段名>);
4)修改表時(shí)刪除唯一約束
不支持MODIFY COLUMN
刪除唯一約束
ALTER TABLE <表名> DROP INDEX <約束名>
盡管設(shè)置了約束名,實(shí)際上無法通過ALTER TABLE <表名> DROP CONSTRAINT <約束名>
來刪除唯一約束于樟。
唯一約束:保證在一個(gè)字段或者一組字段里的數(shù)據(jù)都與表中其它行的對(duì)應(yīng)數(shù)據(jù)不同公条。
唯一索引:不允許具有索引值相同的行,從而禁止重復(fù)的索引或鍵值迂曲。
唯一約束和唯一索引功能相似靶橱,但約束是為了保證數(shù)據(jù)的完整性,索引是為了輔助查詢,在理論上抓韩,不一樣纠永,在實(shí)際使用時(shí),基本沒有區(qū)別谒拴。創(chuàng)建唯一約束時(shí)尝江,會(huì)自動(dòng)創(chuàng)建唯一索引。
唯一約束是通過唯一索引實(shí)現(xiàn)的英上,為了保證沒有重復(fù)值炭序,在插入新記錄時(shí)會(huì)再檢索一遍,為了提高檢索效率苍日,在創(chuàng)建唯一約束的時(shí)候就創(chuàng)建了唯一索引惭聂。
3、外鍵約束
外鍵約束(Foreign Key Constraint)經(jīng)常和主鍵約束一起使用相恃,用來確保數(shù)據(jù)的一致性辜纲。
外鍵約束在列級(jí)不生效
1)表級(jí)用法:
[CONSTRAINT <約束名>] FOREIGN KEY (字段名1[,字段名2,...]) REFERENCES <主表名>(列1 [,列2,...])
2)修改表時(shí)添加外鍵約束
不支持MODIFY COLUMN
添加外鍵約束
ALTER TABLE <表名> ADD [CONSTRAINT <約束名>] FOREIGN KEY (字段名1[,字段名2,...]) REFERENCES <主表名>(列1 [,列2,...])
3)修改表時(shí)刪除外鍵約束
不支持MODIFY COLUMN
刪除外鍵約束
ALTER TABLE <表名> DROP FOREIGN KEY <約束名>;
OR
ALTER TABLE <表名> DROP CONSTRAINT <約束名>;
ALTER TABLE <表名> DROP INDEX <約束名>;
4、檢查約束
檢查約束(Check Constraint)是用來檢查數(shù)據(jù)表中字段值有效性的一種手段拦耐,能夠減少無效數(shù)據(jù)的輸入耕腾。
1)列級(jí)用法
雖然支持列級(jí)用法,但實(shí)際是表級(jí)約束
<字段名> <數(shù)據(jù)類型> CHECK(<檢查約束>)
2)表級(jí)用法
[CONSTRAINT <約束名>] CHECK(<檢查約束>);
3)修改表時(shí)添加檢查約束
不支持MODIFY COLUMN
添加檢查約束
ALTER TABLE <表名> ADD [CONSTRAINT <約束名>] CHECK(<檢查約束>);
4)修改表時(shí)刪除檢查約束
不支持MODIFY COLUMN
刪除檢查約束
ALTER TABLE <表名> DROP CONSTRAINT <約束名>;
5杀糯、非空約束
非空約束(Not Null Constraint)指字段的值不能為空扫俺。
1)列級(jí)用法
<字段名> <數(shù)據(jù)類型> NOT NULL;
不支持表級(jí)用法
2)修改表時(shí)添加非空約束
ALTER TABLE <表名> MODIFY COLUMN <字段名> <數(shù)據(jù)類型> NOT NULL;
3)修改表時(shí)刪除非空約束
ALTER TABLE <表名> MODIFY COLUMN <字段名> <數(shù)據(jù)類型>;
OR
ALTER TABLE <表名> DROP CONSTRAINT <約束名>;
6、默認(rèn)值約束
默認(rèn)值約束(Default Constraint)固翰,用來指定某列的默認(rèn)值狼纬,如果沒有為某個(gè)字段賦值,系統(tǒng)就會(huì)自動(dòng)為這個(gè)字段插入默認(rèn)值骂际。
1)列級(jí)用法
<字段名> <數(shù)據(jù)類型> DEFAULT <默認(rèn)值>;
不支持表級(jí)用法
2)修改表時(shí)添加非空約束
ALTER TABLE <表名> MODIFY COLUMN <字段名> <數(shù)據(jù)類型> DEFAULT <默認(rèn)值>;
3)修改表時(shí)刪除非空約束
ALTER TABLE <表名> MODIFY COLUMN <字段名> <數(shù)據(jù)類型>;
OR
ALTER TABLE <表名> DROP CONSTRAINT <約束名>;
查看當(dāng)前表使用的約束
SHOW CREATE TABLE <表名>;
更新約束必須先DROP再ADD疗琉,不支持直接更新
二、外鍵約束支持級(jí)聯(lián)刪除與更新
通過ON DELETE CASCADE ON UPDATE CASCADE;
可實(shí)現(xiàn)級(jí)聯(lián)刪除與更新
[CONSTRAINT <約束名>] FOREIGN KEY (字段名1[,字段名2,...]) REFERENCES <主表名>(列1 [,列2,...]) ON DELETE CASCADE ON UPDATE CASCADE;
當(dāng)存儲(chǔ)引擎為InnoDB時(shí)方援,外鍵約束條件有以下4種:
(1)restrict方式:同no action没炒,都是立即檢查外鍵約束涛癌;
(2)cascade方式:在父表上update/delete記錄時(shí)犯戏,同步update/delete子表的匹配記錄 ;
(3)No action方式:如果子表中有匹配的記錄,則不允許對(duì)父表對(duì)應(yīng)候選鍵進(jìn)行update/delete操作拳话;
(4)set null方式:在父表上update/delete記錄時(shí)先匪,將子表上匹配記錄的列設(shè)為null 要注意子表的外鍵列不能為not null 。