外鍵約束的參照

1、CASCADE ([k??ske?d] 串行):表之間有外鍵約束時,若對父表進行刪除或更新操作是,與其關聯的子表會自動進行相應的操作

e.g.
創建父表tb2(包含參照列的表)

CREATE TABLE tb2(
id SMALLINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
pname VARCHAR(20) NOT NULL
);
SHOW COLUMNS FROM tb2;#查看父表tb2的表結構

可看到如圖:

tb2表結構

在表中插入數據

INSERT INTO tb2 (pname) VALUES('A');
INSERT INTO tb2 (pname) VALUES('B');
INSERT INTO tb2 (pname) VALUES('C');

SELECT * FROM jdbc.tb2;得到如圖:

tb2的記錄

在創建子表users1:

CREATE TABLE users1 (
id SMALLINT UNSIGNED AUTO_INCREMENT NOT NULL PRIMARY KEY ,
username VARCHAR(20) NOT NULL,
pid SMALLINT UNSIGNED,
FOREIGN KEY (pid) REFERENCES tb2 (id) ON DELETE CASCADE#設置其參照為CASCADE
);

SHOW COLUMNS FROM users1;可以看到users1的表結構:

users1的表結構

這時候就可以對子表users1插入數據:

INSERT INTO users1 (username,pid) VALUES ('小明',3);
INSERT INTO users1 (username,pid) VALUES ('小李',1);
INSERT INTO users1 (username,pid) VALUES ('李雷',2);

可以看到如圖所示:


users1中的記錄

但是如果插入如下語句:

INSERT INTO users1 (username,pid) VALUES ('小明',6);

會得到如下錯誤代碼:

Error Code: 1452. 
Cannot add or update a child row: a foreign key constraint fails (`jdbc`.`users1`, 
CONSTRAINT `users1_ibfk_1` FOREIGN KEY (`pid`) REFERENCES `tb2` (`id`) 
ON DELETE CASCADE)

因為父表中沒有id為6的記錄,不能被參照,故會失敗
需注意,若此時在插入一條正確的記錄

INSERT INTO users1 (username,pid) VALUES ('小黑',2);

再查看user1表:


users1中的記錄

可以看到新插入的記錄id不連續,因為雖然上一條記錄插入失敗,但編號已然增加過了!
好回到正題,將tb2中的一條記錄刪除看tb2表和user1表會有什么變化:

DELETE FROM tb2 WHERE id = 3;

然后得到下圖:


tb2中的記錄

tb2中id為3的記錄被刪除


user1中的記錄

而同時user1中的pid為3的記錄也同時被刪除(即user1中id為1的記錄被刪
除),這便是CASCADE
2、SET NULL:表之間有外鍵約束時,若對父表進行刪除或更新操作是,與其關聯的子表的外鍵列會被這位NULL(必須保證該外鍵列未設置NOT NULL)
3、RESTRICT [r??str?kt] 限制:拒絕父表的更新
4、NO ACTION :標準SQL語句,在MySQL中與RESTRICT相同
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • 外鍵的定義: 如果表A的主關鍵字是表B中的字段,則該字段稱為表B的外鍵,表A稱為主表,表B稱為從表。 外鍵的作用 ...
    詩人小壞閱讀 1,152評論 0 0
  • MySQL技術內幕:InnoDB存儲引擎(第2版) 姜承堯 第1章 MySQL體系結構和存儲引擎 >> 在上述例子...
    沉默劍士閱讀 7,460評論 0 16
  • 1、MySQL啟動和關閉(安裝及配置請參照百度經驗,這里不再記錄。MySQL默認端口號:3306;默認數據類型格式...
    強壯de西蘭花閱讀 677評論 0 1
  • 回顧和概述 數據類型 整型 浮點型 字符型 日期時間型 數據表操作 如何創建數據表 PRIMARY KEY(主鍵約...
    齊天大圣李圣杰閱讀 721評論 0 0
  • 心要往前走 腳步卻不由自主的停下來 閉上眼 我在回憶那擁抱時的心跳 很慌亂
    熊寶123閱讀 182評論 0 0