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