成人在线亚洲_国产日韩视频一区二区三区_久久久国产精品_99国内精品久久久久久久

您的位置:首頁技術文章
文章詳情頁

MySQL外鍵約束的實例講解

瀏覽:3日期:2023-10-09 13:35:56

MySQL的外鍵約束是用來在兩個表之間建立鏈接的,其中一個表發生變化,另外一個表也發生變化。從這個特點來看,它主要是為了保證表數據的一致性和完整性的。對于兩個通過外鍵關聯的表,相關聯字段中主鍵所在的表是主表,也稱之為父表,外鍵所在的表是從表,也稱之為子表,定義外鍵的時候需要遵守幾個規則:

1、父表必須已經存在于數據庫中,或者是當前正在創建的表。如果是后一種情況,則父表與子表是同一個表,這樣的表稱為自參照表,這種結構稱為自參照。2、必須為父表定義主鍵。3、主鍵不能包含空值,但允許在外鍵中出現空值。也就是說,只要外鍵的每個非空值出現在指定的主鍵中,這個外鍵的內容就是正確的。4、外鍵中列的數目必須和父表的主鍵中列的數目相同。5、外鍵中列的數據類型必須和父表主鍵中對應列的數據類型相同。說這么多比較籠統,還是看看例子吧。

mysql:yeyztest ::>>create table fk_test_1( -> id int not null primary key auto_increment, -> name varchar() default ’’);Query OK, rows affected (0.10 sec)mysql:yeyztest ::>>create table fk_test_2( -> id int not null primary key auto_increment, -> uid int, -> foreign key fk_uid(uid) references fk_test_1(id));Query OK, rows affected (0.06 sec)

這里我們創建兩個表,一個是fk_test_1,一個是fk_test_2,其中fk_test_2的uid列上設置外鍵,關聯fk_test_1的表的id列,這里很明顯,fk_test_1是父表,而fk_test_2是子表,接下來我們進行數據插入實驗。

mysql:yeyztest ::>>insert into fk_test_1 values (,’aaa’),(,’bbb’);Query OK, rows affected (0.00 sec)Records: Duplicates: Warnings: mysql:yeyztest ::>>select * from fk_test_1;+----+------+| id | name |+----+------+| | aaa || | bbb |+----+------+ rows in set (0.00 sec)mysql:yeyztest ::>>insert into fk_test_2 values (,),(,);Query OK, rows affected (0.00 sec)Records: Duplicates: Warnings: mysql:yeyztest ::>>insert into fk_test_2 values (,);Query OK, row affected (0.00 sec)mysql:yeyztest ::>>insert into fk_test_2 values (,); ERROR (): Cannot add or update a child row: a foreign key constraint fails (`yeyztest`.`fk_test_2`, CONSTRAINT `fk_test_2_ibfk_1` FOREIGN KEY (`uid`) REFERENCES `fk_test_1` (`id`))

先在主表上插入兩條數據,分別是id=1和id=2的數據,然后再子表插入數據,子表插入uid=1和uid=2的數據都能成功,而要插入uid=3的數據時提示失敗,也就是說,默認情況下,子表進行插入時,插入的外鍵關聯字段值必須是父表被關聯的列包含的值。注意這里的默認情況,后續會進行說明。

再來看看刪除的情況,

mysql:yeyztest ::>>select * from fk_test_2 ;+----+------+| id | uid |+----+------+| | || | || | |+----+------+ rows in set (0.00 sec)mysql:yeyztest ::>>delete from fk_test_2 where id=;Query OK, row affected (0.00 sec)mysql:yeyztest ::>>select * from fk_test_1 ; +----+------+| id | name |+----+------+| | aaa || | bbb |+----+------+ rows in set (0.00 sec)mysql:yeyztest ::>>delete from fk_test_1 where id=; ERROR (): Cannot delete or update a parent row: a foreign key constraint fails (`yeyztest`.`fk_test_2`, CONSTRAINT `fk_test_2_ibfk_1` FOREIGN KEY (`uid`) REFERENCES `fk_test_1` (`id`))

可以看到,在子表fk_test_2上進行刪除,沒有出現任何問題,而在父表fk_test_1上刪除時,顯示無法刪除id=1的值,原因是有一個外鍵約束存在,也就是說,默認情況下,在父表進行刪除時,無法直接刪除子表中已經存在依賴關聯的列值。注意這里的默認情況,下面將會說明。

既然delete不成功,試試update,

mysql:yeyztest ::>>update fk_test_1 set id= where id=; ERROR (): Cannot delete or update a parent row: a foreign key constraint fails (`yeyztest`.`fk_test_2`, CONSTRAINT `fk_test_2_ibfk_1` FOREIGN KEY (`uid`) REFERENCES `fk_test_1` (`id`))mysql:yeyztest ::>>update fk_test_1 set name=’ccc’ where id=; Query OK, row affected (0.00 sec)Rows matched: Changed: Warnings:

可以看到,update父表的主鍵列還是不能成功執行,但是update其他的列,可以成功執行。

到這里,我們已經知道,外鍵的存在是為了保證數據的完整和統一性,但是也帶來了一點問題,那就是父表中凡是被子表依賴的列,都沒辦法刪除了,這不是我們想要的,有一些數據確實會過期,我們有刪除的需求,那么這個時候應該怎么辦?

在上面的測試中,我們反復提到一個詞,就是默認情況,我們沒有設置外鍵的刪除和更新規則,這里mysql幫我們使用了最嚴格的的規則,那就是restrict,其實還有其他一些規則,這里全部列出來:

delete父表的情況:

cascade,set null,no action,restrict

update父表的情況:

cascade,set null,no action,restrict

其中

restrict是默認操作,它表示拒絕父表刪除或者修改外鍵已經被子表所依賴的列,這是最安全的設置; cascade表示在父表發生刪除的時候直接刪除子表的記錄,這是最危險的設置; set null表示父表刪除的時候,對子表進行null值處理; no action表示父表刪除的時候,子表不進行任何改動。

設置關聯的語法如下:

alter table 表名 add constraint FK_ID foreign key (外鍵字段名) references 外表表名 (主鍵字段名)[on delete {cascade | set null | no action| restrict}][on update {cascade | set null | no action| restrict}]

現在我們測試一下這其他三種情況,首先看cascade的情況:

mysql:yeyztest ::>>select * from fk_test_1;+----+------+| id | name |+----+------+| | ccc || | bbb |+----+------+ rows in set (0.00 sec)mysql:yeyztest ::>>select * from fk_test_2;+----+------+| id | uid |+----+------+| | || | |+----+------+ rows in set (0.00 sec)mysql:yeyztest ::>>show create table fk_test_2G*************************** 1. row *************************** Table: fk_test_2Create Table: CREATE TABLE `fk_test_2` ( `id` int() NOT NULL AUTO_INCREMENT, `uid` int() DEFAULT NULL, PRIMARY KEY (`id`), KEY `fk_uid` (`uid`), CONSTRAINT `fk_test_2_ibfk_1` FOREIGN KEY (`uid`) REFERENCES `fk_test_1` (`id`)) ENGINE=InnoDB AUTO_INCREMENT= DEFAULT CHARSET=utf8 row in set (0.00 sec)mysql:yeyztest ::>>alter table fk_test_2 drop foreign key fk_test_2_ibfk_1;Query OK, rows affected (0.02 sec)Records: Duplicates: Warnings: mysql:yeyztest ::>>alter table fk_test_2 add constraint fk_uid foreign key (uid) references fk_test_1(id) on delete cascade;Query OK, rows affected (0.03 sec)Records: Duplicates: Warnings: ###########################################此處刪除父表id=的記錄,查看子表的結果##########################################mysql:yeyztest ::>>delete from fk_test_1 where id=;Query OK, row affected (0.00 sec)mysql:yeyztest ::>>select * from fk_test_1 ;+----+------+| id | name |+----+------+| | ccc |+----+------+ row in set (0.00 sec)mysql:yeyztest ::>>select * from fk_test_2 ;+----+------+| id | uid |+----+------+| | |+----+------+ row in set (0.00 sec)

可以看到,一開始,父表的值包含id=1和id=2的值,子表的值包含uid=2和uid=1的值,當我們刪除父表的id=2的值之后,子表中uid=2的值也直接被刪除了。這就是cascade的作用,也就是級聯刪除。

在看一眼set null的情況:

mysql:yeyztest ::>>alter table fk_test_2 drop foreign key fk_uid; Query OK, row affected (0.02 sec)Records: Duplicates: Warnings: mysql:yeyztest ::>>alter table fk_test_2 add CONSTRAINT `fk_uid` FOREIGN KEY (`uid`) REFERENCES `fk_test_1` (`id`) ON DELETE set null;Query OK, row affected (0.03 sec)Records: Duplicates: Warnings: mysql:yeyztest ::>>delete from fk_test_1 where id=;Query OK, row affected (0.00 sec)mysql:yeyztest ::>>select *from fk_test_1 ;Empty set (0.00 sec)mysql:yeyztest ::>>select *from fk_test_2 ;+----+------+| id | uid |+----+------+| | NULL |+----+------+ row in set (0.00 sec)

可以看到,設置了set null之后,當父表刪除id=1的值時,子表的uid的值變成了null,而沒有刪除記錄。

no action的情況也是類似,只不過是子表的記錄沒有發生任何改動。

以上是父表進行delete的操作,當父表進行update的時候,子表可以選擇的情況也有以上四種,和delete基本保持一致,這里不再贅述。有興趣可以自己測試一發。

最后,說明一點,子表的外鍵列可以為空值。

mysql:yeyztest ::>>insert into fk_test_1 values (,);Query OK, row affected (0.00 sec)mysql:yeyztest ::>>select *from fk_test_2 ; +----+------+| id | uid |+----+------+| | NULL |+----+------+ row in set (0.00 sec)mysql:yeyztest ::>>insert into fk_test_2 values (,NULL);Query OK, row affected (0.00 sec)mysql:yeyztest ::>>insert into fk_test_2 values (,NULL);Query OK, row affected (0.00 sec)mysql:yeyztest ::>>select * from fk_test_2;+----+------+| id | uid |+----+------+| | NULL || | NULL || | NULL |+----+------+ rows in set (0.00 sec)

以上就是MySQL外鍵約束的實例講解的詳細內容,更多關于MySQL外鍵約束的資料請關注好吧啦網其它相關文章!

標簽: MySQL 數據庫
相關文章:
成人在线亚洲_国产日韩视频一区二区三区_久久久国产精品_99国内精品久久久久久久
国产精品色婷婷久久58| 精品视频在线免费观看| 亚洲蜜臀av乱码久久精品| 成人一区二区三区中文字幕| 欧美私人免费视频| 美女尤物国产一区| 91国偷自产一区二区三区成为亚洲经典| 一区二区三区四区乱视频| 激情欧美丁香| 国产精品沙发午睡系列990531| 成人动漫av在线| 精品成人免费观看| 成人av免费在线| 91精品国产一区二区三区蜜臀 | 久久99久久99| 欧美性大战久久| 久久激情五月激情| 欧美视频第二页| 国产又粗又猛又爽又黄91精品| 欧美日韩一区高清| 国产精品主播直播| 欧美日韩系列| 亚洲国产精品精华液网站| 精品乱人伦小说| 欧美妇女性影城| 欧美三级日韩三级| 亚洲人成人一区二区三区| 欧美亚洲禁片免费| 9色精品在线| 亚洲线精品一区二区三区| 亚欧成人精品| 日韩精品免费专区| 欧美区在线观看| 不卡影院免费观看| 国产精品网站一区| 亚洲午夜在线| 亚洲狠狠爱一区二区三区| 久久久久欧美精品| 韩国精品在线观看| 欧美激情在线一区二区三区| 激情丁香综合五月| 亚洲欧美日韩精品久久久久| 精品国免费一区二区三区| 91精品国产综合久久久久久漫画| 欧美无砖专区一中文字| 欧美色国产精品| 国产一区二区三区久久| 久久蜜桃香蕉精品一区二区三区| 欧美人与禽猛交乱配视频| 亚洲精品日韩一| 久久中文欧美| 国产精品一级片| 中文在线一区二区| 久久精品官网| 国产成人综合在线观看| 国产亚洲欧美色| 国产精品免费看| 日韩影视精彩在线| 欧美一区二区在线播放| 欧美二区在线| 亚洲成人手机在线| 91精品综合久久久久久| 午夜久久一区| 亚洲电影一级黄| 日韩一区二区三区视频在线观看 | 成人午夜又粗又硬又大| 国产免费观看久久| 久久久久.com| 成人免费av网站| 一区二区高清视频在线观看| 欧美喷水一区二区| 国内久久精品| 精品在线亚洲视频| 欧美国产禁国产网站cc| 欧洲一区二区三区在线| 91欧美一区二区| 三级精品在线观看| 久久亚洲综合色一区二区三区| 一本色道久久综合亚洲二区三区| 狠狠色丁香婷婷综合| 中文字幕日韩欧美一区二区三区| 欧美性欧美巨大黑白大战| 欧美女人交a| 美女视频黄a大片欧美| 国产日产精品1区| 日本丶国产丶欧美色综合| 91麻豆视频网站| 男女视频一区二区| 国产精品国产a级| 欧美精品第1页| 最新亚洲视频| 粉嫩欧美一区二区三区高清影视| 亚洲国产精品精华液网站| 久久久久青草大香线综合精品| 色天使色偷偷av一区二区| 欧美在线国产| 久久精品久久综合| 综合网在线视频| 日韩视频免费观看高清完整版| 亚洲少妇一区| 大尺度一区二区| 色噜噜夜夜夜综合网| 成人免费看的视频| 午夜久久久久久电影| 久久综合久久99| 国产欧美在线| 成人app下载| 首页欧美精品中文字幕| 国产性天天综合网| 欧美日韩一区三区| 国产亚洲精品久久久久婷婷瑜伽| 成人污视频在线观看| 日韩电影在线观看一区| 国产精品乱码一区二区三区软件 | 久久精品在这里| 欧美丝袜丝nylons| 99re6热在线精品视频播放速度| 成人av资源下载| 美女mm1313爽爽久久久蜜臀| 日韩亚洲欧美精品| 制服丝袜成人动漫| 精品亚洲aⅴ乱码一区二区三区| 亚洲精品一区二区三区蜜桃下载| 亚洲永久免费| 欧美fxxxxxx另类| 国产精品香蕉一区二区三区| 丝袜a∨在线一区二区三区不卡| 国产精品对白交换视频 | 在线视频成人| 成人av在线资源网| 韩国精品免费视频| 午夜精品一区二区三区三上悠亚| 中文字幕va一区二区三区| 日韩美女一区二区三区四区| 久久永久免费| 中文精品视频| 激情六月综合| 欧美永久精品| 播五月开心婷婷综合| 韩国一区二区视频| 丝袜亚洲另类丝袜在线| 亚洲女与黑人做爰| 最好看的中文字幕久久| 国产欧美一区二区在线| 日韩理论片中文av| 亚洲成人动漫在线观看| 久久97超碰国产精品超碰| 国产成人综合在线| 国产精品久久久久久久免费软件 | 欧美性高清videossexo| 亚洲欧美日韩精品一区二区| 狠狠噜噜久久| 欧美日本在线| 欧美承认网站| 欧美激情偷拍| 视频一区中文字幕| 亚洲综合在线视频| 一区二区三区不卡视频在线观看| 日韩毛片在线免费观看| 国产精品久久久久久久久果冻传媒| 久久精品欧美一区二区三区不卡| 精品国产乱码久久久久久图片 | 亚洲影院在线观看| 一区二区三区四区av| 一区二区三区精品在线观看| 亚洲黄色免费电影| 久久精品国产成人一区二区三区 | 99久久er热在这里只有精品66| 日韩精品一区国产麻豆| 亚洲激情一区二区| 经典三级视频一区| 中文字幕一区日韩精品欧美| 欧美日韩国产一区| 国产亚洲精品v| 日韩电影免费在线看| 欧美精品aa| 人人狠狠综合久久亚洲| 久久免费精品国产久精品久久久久| 一区二区三区精品国产| av综合在线播放| 久久99精品视频| 国产精品毛片a∨一区二区三区| 蜜桃av综合| 一个色在线综合| 免费欧美日韩| 成人av中文字幕| 成人av在线观| 色综合欧美在线| 欧美三级免费| 亚洲青色在线| 亚洲精品久久| 久久精品官网| 欧美日韩国产小视频| 日韩欧美电影一二三| 久久久久国产精品麻豆ai换脸| 中文字幕精品—区二区四季| 亚洲色欲色欲www| 午夜天堂影视香蕉久久| 精品一区二区三区在线播放 | 99视频一区二区|