(四)約束及修改數(shù)據(jù)表


1、約束概述

約束的目的是為了保證數(shù)據(jù)的完整性與一致性。

按照約束的范圍劃分:
列級(jí)約束:只對(duì)一個(gè)數(shù)據(jù)列建立約束忧吟。既可以在列定義時(shí)聲明,也可以在列定義后聲明斩披;
表級(jí)約束:對(duì)多個(gè)數(shù)據(jù)列建立約束溜族。只能在列定義后聲明;

按照約束的功能劃分:
非空約束——NOT NULL
主鍵約束——PRIMARY KEY
唯一約束——UNIQUE KEY
默認(rèn)約束——DEFAULT
外鍵約束——FOREIGN KEY

在實(shí)際開發(fā)中垦沉,表級(jí)約束很少用到煌抒,更多的會(huì)使用列級(jí)約束;除此之外厕倍,在所有的約束中寡壮,并不一定每種功能的約束都存在著表級(jí)或列級(jí)之分。其中,非空約束和默認(rèn)約束就不存在表級(jí)約束况既,它們只有列級(jí)約束这溅;而對(duì)于主鍵約束、唯一約束棒仍、外鍵約束都可以作為表級(jí)約束或列級(jí)約束悲靴。


2、外鍵約束的要求解析

前四種約束的用法及效果可參見操作數(shù)據(jù)表降狠,現(xiàn)在來(lái)看一下外鍵約束:外鍵約束即“FOREIGN KEYp”对竣,可以保證數(shù)據(jù)的完整性與一致性庇楞,實(shí)現(xiàn)數(shù)據(jù)表一對(duì)一或一對(duì)多的關(guān)系榜配,這也是許多數(shù)據(jù)庫(kù)被稱為“關(guān)系型數(shù)據(jù)庫(kù)”的根本原因。

創(chuàng)建外鍵約束需要滿足如下要求:

  1. 父表(包含參照列)和子表(包含外鍵列)必須使用相同的存儲(chǔ)引擎吕晌,且存儲(chǔ)引擎只能為InnoDB蛋褥,而且禁止使用臨時(shí)表;
  2. 外鍵列和參照列必須具有相似的數(shù)據(jù)類型睛驳,其中:數(shù)字的長(zhǎng)度或是否有符號(hào)位必須相同烙心,而字符的則長(zhǎng)度可以不同;
  3. 外鍵列和參照列必須創(chuàng)建索引乏沸,如果外鍵列不存在索引淫茵,MySQL將自動(dòng)創(chuàng)建索引。

創(chuàng)建父表“provinces”蹬跃,并檢查其存儲(chǔ)引擎:


創(chuàng)建子表“users”匙瘪,此表的目的是記錄用戶的省份信息,在使用外鍵約束后蝶缀,只需要父表的“id”就可以獲取相應(yīng)的省份丹喻,但是根據(jù)要求對(duì)于數(shù)字的長(zhǎng)度必須相同,因此在使用數(shù)據(jù)類型“BIGINT”后翁都,系統(tǒng)提示錯(cuò)誤:


  此時(shí)已將數(shù)據(jù)類型修改為相同的“SMALLINT”碍论,但系統(tǒng)仍然提示錯(cuò)誤,原因是父表中注明“UNSIGNED”柄慰,即無(wú)符號(hào)位鳍悠,而子表中并沒有注明,因此出錯(cuò):



  最終完成子表的創(chuàng)建:

輸入“SHOW INDEXES FROM tbl_name”可查看該表的索引情況:


  由于“id”字段使用了主鍵坐搔,而主鍵會(huì)自動(dòng)創(chuàng)建索引藏研,因此參照列已經(jīng)具有了索引,再來(lái)看外鍵列:

  可見具有兩個(gè)索引薯蝎,一個(gè)是“id”字段遥倦,另一個(gè)則是外鍵列“p_id”字段,查看該數(shù)據(jù)表的結(jié)構(gòu)可以發(fā)現(xiàn):

  系統(tǒng)已自動(dòng)為其創(chuàng)建了索引。

注意:
父表——子表所參照的表“provinces”
子表——含有外鍵“FOREIGN KEY”的表“users”
參照列——父表中“id”字段列
外鍵列——子表中“p_id”字段列


3袒哥、外鍵約束的參照操作

外鍵約束的參照操作缩筛,簡(jiǎn)單理解就是在創(chuàng)建外鍵約束之后,更新父表時(shí)堡称,子表是否進(jìn)行同樣的操作瞎抛,共有如下4種:

  1. CASCADE:從父表刪除或更新且自動(dòng)刪除或更新子表中匹配的行;
  1. SET NULL:從父表刪除或更新行却紧,并設(shè)置子表中的外鍵列為“NULL”桐臊。如果使用該選項(xiàng),必須保證子表列沒有指定“NOT NLUU”晓殊;
  2. RESTRICT:拒絕對(duì)父表的刪除或更新操作断凶;
  3. NO ACTION:標(biāo)準(zhǔn)SQL的關(guān)鍵字,在MySQL中與“RESTRICT”作用相同巫俺。

以“CASCADE”為例進(jìn)行演示认烁,創(chuàng)建子表“users1”:


在創(chuàng)建外鍵時(shí)添加“ON DELETE CASCADE”
在創(chuàng)建外鍵時(shí)添加“ON DELETE CASCADE”

  之后,需要在兩張數(shù)據(jù)表中添加記錄介汹,要注意却嗡,必須先在父表中添加記錄,子表才能有所參照:

在父表中添加三個(gè)省份信息嘹承,之后向子表中添加用戶信息窗价,只需要寫入用戶名及父表中省份的“id”即可:


  之所以在添加“John”用戶時(shí)出錯(cuò),是因?yàn)楦副碇懈静淮嬖凇癷d”為9的省份叹卷,因而報(bào)錯(cuò)撼港。查看該數(shù)據(jù)表的結(jié)構(gòu)可發(fā)現(xiàn):

“id”排列沒有序號(hào)3是因?yàn)椋m然之前輸入記錄時(shí)“‘John’豪娜,9”報(bào)錯(cuò)沒有計(jì)入餐胀,但是編號(hào)已經(jīng)自動(dòng)遞增一位,因此最終的用戶“id”為1瘤载、2否灾、4、5鸣奔。此時(shí)刪除父表中“id”為3的省份墨技,看子表是否也會(huì)發(fā)生改變:

可見父表中“id”為3的省份已被刪除,而子表中“p_id”為3的用戶“Rose”也一同被刪除了挎狸。

注意:
  關(guān)于外鍵約束扣汪,在實(shí)際的開發(fā)過(guò)程中,其實(shí)很少使用物理性的外鍵約束锨匆,更多的會(huì)去使用邏輯性的外鍵約束崭别,因?yàn)槲锢硇缘耐怄I約束只有InnoDB這種引擎才會(huì)支持冬筒,然而另一種MyISAM引擎則不支持。換句話說(shuō)茅主,如果創(chuàng)建一張數(shù)據(jù)表舞痰,其存儲(chǔ)引擎為MyISAM,但又想使用這種物理性的外鍵約束的話诀姚,其實(shí)是不可能實(shí)現(xiàn)的响牛,因此,在實(shí)際的項(xiàng)目開發(fā)中赫段,不會(huì)去定義物理性的外鍵呀打。所謂的邏輯性外鍵指的就是在創(chuàng)建數(shù)據(jù)表之前,已經(jīng)定義好多張數(shù)據(jù)表的結(jié)構(gòu)糯笙,而不去使用“FOREIGN KEY”這個(gè)關(guān)鍵詞贬丛。


4、修改數(shù)據(jù)表——添加/刪除列

添加單列
ALTER TABLE tbl_name ADD [COLUMN] col_name columan_definition [FIRST | AFTER col_name]
** “FIRST col_name”指所插入的列位于指定列之前炬丸;“AFTER col_name”指所插入的列位于指定列之后瘫寝;如果都省略蜒蕾,則默認(rèn)在所有列之后插入該列稠炬。**

首先查看“users1”的數(shù)據(jù)結(jié)構(gòu),之后插入數(shù)據(jù)列“age”咪啡,且不指定其位置首启,再次查看該表結(jié)構(gòu)可發(fā)現(xiàn),新添加的列“age”確實(shí)位于所有列之后撤摸,排在末尾:


添加一列“password”毅桃,指定其位置在“username”列之后:


再添加一列“truename”,指定其位置在所有列之前:


添加多列
ALTER TABLE tbl_name ADD [COLUMN] (col_name columan_definition , ……)
添加多列時(shí)准夷,列名與定義信息要放在小括號(hào)內(nèi)钥飞,且不能指定位置,只能放在已有列的末尾

一次性向數(shù)據(jù)表“users1”中添加多列:

刪除列
ALTER TABLE tbl_name DROP [COLUMN] col_name , ……
可以刪除一列衫嵌,可以刪除多列读宙,還可以在刪除的同時(shí)新增列

刪除“username”列:


刪除“age”列同時(shí),新增“username”列:


一次性刪除多列:



5楔绞、修改數(shù)據(jù)表——添加/刪除約束

添加主鍵約束
ALTER TABLE tbl_name ADD [CONSTRAINT [symbol]] PRIMARY KEY [index_type] (index_col_name,……)
其中“CONSTRAINT”關(guān)鍵字可以自定義主鍵名结闸,而“index_type”索引類型后面會(huì)講到。

創(chuàng)建新的數(shù)據(jù)表“users2”酒朵,且不設(shè)置主鍵:


新增一列“id”桦锄,且為其添加主鍵,主鍵名為“PK_users2_id”:


添加唯一約束
ALTER TABLE tbl_name ADD [CONSTRAINT [symbol]] UNIQUE [INDEX|KEY] [index_name] [index_type] (index_col_name,……)

為“username”添加唯一約束:


添加外鍵約束
ALTER TABLE tbl_name ADD [CONSTRAINT [symbol]] FOREIGN KEY [index_name] (index_col_name,……) reference_definition

為“p_id”添加外鍵約束:

添加默認(rèn)約束
ALTER TABLE tbl_name ALTER [COLUMN] col_name SET DEFAULT literal

為新建字段“age”添加默認(rèn)約束:


刪除主鍵約束
ALTER TABLE tbl_name DROP PRIMARY KEY

刪除唯一約束
ALTER TABLE tbl_name DROP {INDEX|KEY} index_name
**由于一張數(shù)據(jù)表可以有多個(gè)唯一約束蔫耽,因此刪除時(shí)需要添加索引名 **

首先查看“username”字段上唯一約束的索引名:


“Key_name”即索引名
“Key_name”即索引名

刪除的“username”是索引名即唯一約束结耀,而不是字段:


刪除外鍵約束
ALTER TABLE tbl_name DROP FOREIGN KEY fk_symbol
**注意刪除時(shí)需要添加外鍵約束名 **

首先查看“p_id”字段上的外鍵約束名:


系統(tǒng)自動(dòng)添加的外鍵約束名“users2_ibfk_1”
系統(tǒng)自動(dòng)添加的外鍵約束名“users2_ibfk_1”

刪除“p_id”字段上的外鍵約束:



  可見已經(jīng)沒有“FOREIGN KEY”等信息:


刪除默認(rèn)約束
ALTER TABLE tbl_name ALTER [COLUMN] col_name DROP DEFAULT

刪除字段“age”的默認(rèn)約束:



6、修改數(shù)據(jù)表——修改列定義/更名操作

修改列定義
ALTER TABLE tbl_name MODIFY [COLUMN] col_name col_definition [FIRST|AFTER col_name]

修改字段“id”的數(shù)據(jù)類型為“TINYINT”并將其挪至數(shù)據(jù)表起始位置:


注意:
  由范圍較大的數(shù)據(jù)類型(例如“SMALLINT”)修改成范圍較小的數(shù)據(jù)類型(例如“TINYINT”),可能會(huì)造成數(shù)據(jù)的丟失图甜。


修改列名稱
ALTER TABLE tbl_name CHANGE [COLUMN] old_col_name new_col_name col_definition [FIRST|AFTER col_name]
使用“CHANGE”關(guān)鍵字不僅包含“MODIFY”關(guān)鍵字的功能香伴,還可以修改字段名稱。

修改字段“p_id”的名稱為“pid”具则,數(shù)據(jù)類型為“TINYINT”并將其挪至“age”字段的后面:


修改數(shù)據(jù)表名稱
方法一:
ALTER TABLE tbl_name RENAME [TO|AS] new_tbl_name
方法二:
RENAME TABLE tbl_name TO new_tbl_name [, tbl_name TO new_tbl_name]……

使用方法一將數(shù)據(jù)表“users2”名稱修改為“users3”:


使用方法二將數(shù)據(jù)表“users3”名稱修改為“users2”:


注意:
  實(shí)際上應(yīng)盡量少的使用數(shù)據(jù)列及數(shù)據(jù)表的更名操作即纲,因?yàn)楫?dāng)創(chuàng)建了索引或使用過(guò)視圖、存儲(chǔ)過(guò)程之后博肋,在表名或列名被引用的情況下低斋,修改其名稱可能會(huì)導(dǎo)致視圖或存儲(chǔ)過(guò)程等無(wú)法正常工作。


7匪凡、修改數(shù)據(jù)表的SQL語(yǔ)句匯總:

  • 添加/刪除列
    添加單列:ALTER TABLE tbl_name ADD [COLUMN] col_name columan_definition [FIRST | AFTER col_name];
    添加多列:ALTER TABLE tbl_name ADD [COLUMN] (col_name columan_definition , ……);
    刪除列:ALTER TABLE tbl_name DROP [COLUMN] col_name , ……;

  • 添加/刪除約束
    添加主鍵約束:ALTER TABLE tbl_name ADD [CONSTRAINT [symbol]] PRIMARY KEY [index_type] (index_col_name,……);
    添加唯一約束:ALTER TABLE tbl_name ADD [CONSTRAINT [symbol]] UNIQUE [INDEX|KEY] [index_name] [index_type] (index_col_name,……);
    添加外鍵約束:ALTER TABLE tbl_name ADD [CONSTRAINT [symbol]] FOREIGN KEY [index_name] (index_col_name,……) reference_definition;
    添加默認(rèn)約束:ALTER TABLE tbl_name ALTER [COLUMN] col_name SET DEFAULT literal;
    刪除主鍵約束:ALTER TABLE tbl_name DROP PRIMARY KEY;
    刪除唯一約束:ALTER TABLE tbl_name DROP {INDEX|KEY} index_name;
    刪除外鍵約束:ALTER TABLE tbl_name DROP FOREIGN KEY fk_symbol;
    刪除默認(rèn)約束:ALTER TABLE tbl_name ALTER [COLUMN] col_name DROP DEFAULT;

  • 修改列定義/更名操作
    修改列定義:ALTER TABLE tbl_name MODIFY [COLUMN] col_name col_definition [FIRST|AFTER col_name];
    修改列名稱:ALTER TABLE tbl_name CHANGE [COLUMN] old_col_name new_col_name col_definition [FIRST|AFTER col_name];
    修改數(shù)據(jù)表名稱
    方法一:ALTER TABLE tbl_name RENAME [TO|AS] new_tbl_name;
    方法二:RENAME TABLE tbl_name TO new_tbl_name [, tbl_name TO new_tbl_name]……;


版權(quán)聲明:歡迎轉(zhuǎn)載膊畴,歡迎擴(kuò)散,但轉(zhuǎn)載時(shí)請(qǐng)標(biāo)明作者以及原文出處病游,謝謝合作邮旷!             ↓↓↓
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末龟再,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌制圈,老刑警劉巖剂府,帶你破解...
    沈念sama閱讀 221,198評(píng)論 6 514
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件竖慧,死亡現(xiàn)場(chǎng)離奇詭異疲吸,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)狮惜,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,334評(píng)論 3 398
  • 文/潘曉璐 我一進(jìn)店門高诺,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人碾篡,你說(shuō)我怎么就攤上這事虱而。” “怎么了开泽?”我有些...
    開封第一講書人閱讀 167,643評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵牡拇,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我眼姐,道長(zhǎng)诅迷,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,495評(píng)論 1 296
  • 正文 為了忘掉前任众旗,我火速辦了婚禮罢杉,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘贡歧。我一直安慰自己滩租,他們只是感情好赋秀,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,502評(píng)論 6 397
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著律想,像睡著了一般猎莲。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上技即,一...
    開封第一講書人閱讀 52,156評(píng)論 1 308
  • 那天著洼,我揣著相機(jī)與錄音,去河邊找鬼而叼。 笑死身笤,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的葵陵。 我是一名探鬼主播液荸,決...
    沈念sama閱讀 40,743評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼脱篙!你這毒婦竟也來(lái)了娇钱?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,659評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤绊困,失蹤者是張志新(化名)和其女友劉穎文搂,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體考抄,經(jīng)...
    沈念sama閱讀 46,200評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡细疚,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,282評(píng)論 3 340
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了川梅。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,424評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡然遏,死狀恐怖贫途,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情待侵,我是刑警寧澤丢早,帶...
    沈念sama閱讀 36,107評(píng)論 5 349
  • 正文 年R本政府宣布,位于F島的核電站秧倾,受9級(jí)特大地震影響怨酝,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜那先,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,789評(píng)論 3 333
  • 文/蒙蒙 一农猬、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧售淡,春花似錦斤葱、人聲如沸慷垮。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,264評(píng)論 0 23
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)料身。三九已至,卻和暖如春衩茸,著一層夾襖步出監(jiān)牢的瞬間芹血,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,390評(píng)論 1 271
  • 我被黑心中介騙來(lái)泰國(guó)打工楞慈, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留祟牲,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,798評(píng)論 3 376
  • 正文 我出身青樓抖部,卻偏偏與公主長(zhǎng)得像说贝,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子慎颗,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,435評(píng)論 2 359

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

  • 回顧和概述 數(shù)據(jù)類型 整型 浮點(diǎn)型 字符型 日期時(shí)間型 數(shù)據(jù)表操作 如何創(chuàng)建數(shù)據(jù)表 PRIMARY KEY(主鍵約...
    齊天大圣李圣杰閱讀 707評(píng)論 0 0
  • 1乡恕、MySQL啟動(dòng)和關(guān)閉(安裝及配置請(qǐng)參照百度經(jīng)驗(yàn),這里不再記錄俯萎。MySQL默認(rèn)端口號(hào):3306傲宜;默認(rèn)數(shù)據(jù)類型格式...
    強(qiáng)壯de西蘭花閱讀 654評(píng)論 0 1
  • 什么是數(shù)據(jù)庫(kù)? 數(shù)據(jù)庫(kù)是存儲(chǔ)數(shù)據(jù)的集合的單獨(dú)的應(yīng)用程序夫啊。每個(gè)數(shù)據(jù)庫(kù)具有一個(gè)或多個(gè)不同的API函卒,用于創(chuàng)建,訪問(wèn)撇眯,管理...
    chen_000閱讀 4,039評(píng)論 0 19
  • 系統(tǒng)用戶: 1.sys system(sys權(quán)限最高) 2.sysman(操作企業(yè)管理器) 密碼是安裝的時(shí)候輸入的...
    3hours閱讀 1,572評(píng)論 0 0
  • i'm sorry,i'm writing it with english,just because my ...
    我不是路人甲閱讀 172評(píng)論 0 1