Mysql約束

一匪燕、約束基本概念

約束:指對(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 。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末弃衍,一起剝皮案震驚了整個(gè)濱河市呀非,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖岸裙,帶你破解...
    沈念sama閱讀 211,042評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件猖败,死亡現(xiàn)場離奇詭異,居然都是意外死亡降允,警方通過查閱死者的電腦和手機(jī)恩闻,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,996評(píng)論 2 384
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來剧董,“玉大人幢尚,你說我怎么就攤上這事〕崧ィ” “怎么了尉剩?”我有些...
    開封第一講書人閱讀 156,674評(píng)論 0 345
  • 文/不壞的土叔 我叫張陵,是天一觀的道長毅臊。 經(jīng)常有香客問我理茎,道長,這世上最難降的妖魔是什么管嬉? 我笑而不...
    開封第一講書人閱讀 56,340評(píng)論 1 283
  • 正文 為了忘掉前任功蜓,我火速辦了婚禮,結(jié)果婚禮上宠蚂,老公的妹妹穿的比我還像新娘式撼。我一直安慰自己,他們只是感情好求厕,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,404評(píng)論 5 384
  • 文/花漫 我一把揭開白布著隆。 她就那樣靜靜地躺著,像睡著了一般呀癣。 火紅的嫁衣襯著肌膚如雪美浦。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,749評(píng)論 1 289
  • 那天项栏,我揣著相機(jī)與錄音浦辨,去河邊找鬼。 笑死沼沈,一個(gè)胖子當(dāng)著我的面吹牛流酬,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播列另,決...
    沈念sama閱讀 38,902評(píng)論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼芽腾,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了页衙?” 一聲冷哼從身側(cè)響起摊滔,我...
    開封第一講書人閱讀 37,662評(píng)論 0 266
  • 序言:老撾萬榮一對(duì)情侶失蹤阴绢,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后艰躺,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體呻袭,經(jīng)...
    沈念sama閱讀 44,110評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,451評(píng)論 2 325
  • 正文 我和宋清朗相戀三年腺兴,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了棒妨。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,577評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡含长,死狀恐怖券腔,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情拘泞,我是刑警寧澤纷纫,帶...
    沈念sama閱讀 34,258評(píng)論 4 328
  • 正文 年R本政府宣布,位于F島的核電站陪腌,受9級(jí)特大地震影響辱魁,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜诗鸭,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,848評(píng)論 3 312
  • 文/蒙蒙 一染簇、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧强岸,春花似錦锻弓、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,726評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至妓盲,卻和暖如春杂拨,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背悯衬。 一陣腳步聲響...
    開封第一講書人閱讀 31,952評(píng)論 1 264
  • 我被黑心中介騙來泰國打工弹沽, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人筋粗。 一個(gè)月前我還...
    沈念sama閱讀 46,271評(píng)論 2 360
  • 正文 我出身青樓策橘,卻偏偏與公主長得像,于是被迫代替她去往敵國和親亏狰。 傳聞我的和親對(duì)象是個(gè)殘疾皇子役纹,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,452評(píng)論 2 348

推薦閱讀更多精彩內(nèi)容

  • @[toc] MySQL約束概述 MySQL約束是一種限制策州,它通過限制表中的數(shù)據(jù)瘸味,來確保數(shù)據(jù)的完整性和唯一性。使用...
    夜雨流云閱讀 211評(píng)論 0 0
  • 1. DQL:查詢語句 1. 排序查詢 2. 聚合函數(shù) 3. 分組查詢 4. 分頁查詢 2. 約束 3. 多表之間...
    呂游_b601閱讀 448評(píng)論 0 0
  • 內(nèi)容提綱 DQL:查詢語句排序查詢聚合函數(shù)分組查詢分頁查詢 約束 多表之間的關(guān)系 范式 數(shù)據(jù)庫的備份和還原 DQL...
    h2coder閱讀 181評(píng)論 0 0
  • 概念: 為了保證數(shù)據(jù)的完整性和一致性够挂,MySQL提供了約束這個(gè)屬性旁仿。約束分為表級(jí)約束和列級(jí)約束,如果約束只是針對(duì)某...
    指間Hrc閱讀 662評(píng)論 0 2
  • -- 1:通過修改表結(jié)構(gòu)添加主鍵 /* create table 表名( ... ); alte...
    數(shù)據(jù)開發(fā)小胡閱讀 439評(píng)論 0 0