校园春色亚洲色图_亚洲视频分类_中文字幕精品一区二区精品_麻豆一区区三区四区产品精品蜜桃

主頁 > 知識庫 > MySQL外鍵約束的實例講解

MySQL外鍵約束的實例講解

熱門標簽:百度地圖圖標標注中心 石家莊電商外呼系統 芒果電話機器人自動化 廣東人工電話機器人 湖南人工外呼系統多少錢 日照旅游地圖標注 申請外呼電話線路 信陽穩定外呼系統運營商 南通自動外呼系統軟件

 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_2\G
*************************** 1. row ***************************
  Table: fk_test_2
Create 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非空約束(not null)案例講解
  • MySQL外鍵約束(FOREIGN KEY)案例講解
  • MySQL 外鍵約束和表關系相關總結
  • MySQL完整性約束的定義與實例教程
  • MySQL 8.0新特性 — 檢查性約束的使用簡介
  • MySQL中外鍵的創建、約束以及刪除
  • Mysql中索引和約束的示例語句
  • 詳解MySQL 外鍵約束
  • mysql完整性約束實例詳解
  • MySQL約束超詳解

標簽:阿里 沈陽 惠州 天津 牡丹江 呼和浩特 合肥 公主嶺

巨人網絡通訊聲明:本文標題《MySQL外鍵約束的實例講解》,本文關鍵詞  MySQL,外鍵,約束,的,實例,;如發現本文內容存在版權問題,煩請提供相關信息告之我們,我們將及時溝通與處理。本站內容系統采集于網絡,涉及言論、版權與本站無關。
  • 相關文章
  • 下面列出與本文章《MySQL外鍵約束的實例講解》相關的同類信息!
  • 本頁收集關于MySQL外鍵約束的實例講解的相關信息資訊供網民參考!
  • 推薦文章
    校园春色亚洲色图_亚洲视频分类_中文字幕精品一区二区精品_麻豆一区区三区四区产品精品蜜桃
    久久婷婷一区二区三区| 欧美一区二区精品久久911| 视频一区二区三区中文字幕| 久久先锋影音av鲁色资源| 在线观看日韩电影| 国产99精品国产| 调教+趴+乳夹+国产+精品| 中文字幕欧美日韩一区| 日韩三级.com| 欧美揉bbbbb揉bbbbb| 99天天综合性| 成人国产精品免费网站| 石原莉奈在线亚洲二区| 亚洲免费在线视频| 国产精品国产三级国产普通话三级| 日韩视频在线你懂得| 欧美在线观看视频在线| 99精品视频一区| 国产伦精品一区二区三区免费迷| 午夜精品久久久久久久蜜桃app| 亚洲私人影院在线观看| 国产精品你懂的在线| 国产日韩欧美不卡| 久久久久久久久蜜桃| 26uuu精品一区二区三区四区在线| 欧美日韩国产经典色站一区二区三区| 99re66热这里只有精品3直播| 国产精品自拍三区| 久久99精品国产| 蜜桃av噜噜一区| 久久精品国产亚洲高清剧情介绍| 日韩精品电影在线观看| 婷婷六月综合亚洲| 亚洲va中文字幕| 亚洲成年人网站在线观看| 亚洲高清中文字幕| 午夜视频一区二区三区| 日韩精品成人一区二区三区| 午夜视频一区二区| 日本在线不卡一区| 久久精品国产亚洲a| 国内欧美视频一区二区| 黑人精品欧美一区二区蜜桃| 经典一区二区三区| 国产精品一二三四五| 波多野洁衣一区| 91亚洲精品一区二区乱码| 日本久久一区二区| 精品视频在线免费看| 7777精品伊人久久久大香线蕉超级流畅 | 色婷婷久久综合| 一本久道中文字幕精品亚洲嫩| 99久久国产免费看| 欧美亚洲高清一区二区三区不卡| 欧美视频一二三区| 欧美一区二区私人影院日本| 精品欧美一区二区三区精品久久| 欧美精品一区二区三区视频| 欧美激情综合五月色丁香| 自拍偷拍欧美精品| 亚洲成人资源网| 久久精品国产99| 99国产精品久久久久久久久久久| 一本色道亚洲精品aⅴ| 欧美日韩亚洲综合一区二区三区| 91精品国产91热久久久做人人| 日韩视频在线永久播放| 国产精品日日摸夜夜摸av| 亚洲最大色网站| 日本成人在线一区| 粗大黑人巨茎大战欧美成人| 在线观看日韩毛片| 欧美va亚洲va在线观看蝴蝶网| 中文字幕精品—区二区四季| 亚洲一区二区视频| 韩国成人在线视频| 色综合久久精品| 日韩欧美的一区二区| 国产精品丝袜久久久久久app| 亚洲午夜av在线| 国产尤物一区二区在线| 欧美偷拍一区二区| 日本一区二区三区视频视频| 亚洲sss视频在线视频| 国产91对白在线观看九色| 欧美日韩一区二区欧美激情| 久久精品亚洲一区二区三区浴池| 亚洲六月丁香色婷婷综合久久 | 久久99久久久久久久久久久| 成人黄色网址在线观看| 91精品国产品国语在线不卡| 国产精品免费网站在线观看| 麻豆91精品视频| 色视频一区二区| 国产欧美一区二区三区网站| 日一区二区三区| 99久久伊人久久99| 日韩丝袜情趣美女图片| 一区二区三区四区激情| 国产成人综合在线| 日韩欧美一区二区免费| 午夜视频在线观看一区二区| 91片黄在线观看| 国产日韩在线不卡| 久久国产三级精品| 欧美福利电影网| 一区二区三区四区视频精品免费 | 欧美电影在线免费观看| 亚洲日本一区二区| 99久久婷婷国产| 日本一区二区电影| 国产一区二区0| 欧美电影免费观看高清完整版在线| 亚洲一区二区三区四区中文字幕 | 精品奇米国产一区二区三区| 午夜久久久久久久久| 一本一道久久a久久精品综合蜜臀| 日本一区二区三区久久久久久久久不| 天天色图综合网| 欧美成人性战久久| 久久久久久久精| 免费高清在线一区| 4438亚洲最大| 日韩高清不卡在线| 欧美私人免费视频| 亚洲国产日韩精品| 欧美在线影院一区二区| 亚洲精品成人天堂一二三| 91视频免费看| 亚洲精品videosex极品| 色成人在线视频| 一区二区理论电影在线观看| 日本丰满少妇一区二区三区| 亚洲女同一区二区| 欧美自拍偷拍一区| 亚洲成人综合视频| 欧美一级专区免费大片| 视频一区免费在线观看| 欧美一区二区三区四区在线观看 | 欧美午夜一区二区| 一区二区三区久久久| 欧洲生活片亚洲生活在线观看| 亚洲精品国产成人久久av盗摄| 色婷婷狠狠综合| 午夜在线电影亚洲一区| 91精品国产色综合久久久蜜香臀| 麻豆国产91在线播放| 久久久亚洲欧洲日产国码αv| 国产传媒欧美日韩成人| 亚洲视频免费在线| 欧美另类z0zxhd电影| 久久99精品久久只有精品| 欧美国产欧美综合| 91福利精品视频| 午夜av电影一区| 久久五月婷婷丁香社区| gogo大胆日本视频一区| 亚洲国产精品一区二区久久 | 国产精品视频看| 91美女在线视频| 日韩精品国产欧美| 久久久久久久久一| 色综合久久综合网97色综合| 婷婷中文字幕一区三区| 久久免费看少妇高潮| 91美女在线视频| 美女免费视频一区| 国产精品久久三| 欧美男男青年gay1069videost| 国产一区美女在线| 一区二区三区在线观看动漫| 日韩欧美精品三级| 91老师片黄在线观看| 免费在线观看不卡| 中文字幕在线不卡一区| 91精品婷婷国产综合久久性色 | 中文字幕一区二区三区蜜月| 欧美日韩一级黄| 国产精品系列在线播放| 亚洲在线视频免费观看| 精品精品欲导航| 9色porny自拍视频一区二区| 青青草国产精品97视觉盛宴| 国产精品免费av| 日韩一二三区不卡| 色女孩综合影院| 国产伦精品一区二区三区免费| 亚洲与欧洲av电影| 国产欧美一区二区精品久导航| 欧美视频在线观看一区| 成人午夜在线视频| 日本欧美一区二区三区乱码| 自拍偷拍欧美激情| 久久久99免费| 欧美一区二区三区在线| 91美女精品福利| 国产精品888| 美女诱惑一区二区| 亚洲图片欧美视频| 中文字幕制服丝袜一区二区三区|