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的表结构
可看到如图:
在表中插入数据
INSERT INTO tb2 (pname) VALUES('A');
INSERT INTO tb2 (pname) VALUES('B');
INSERT INTO tb2 (pname) VALUES('C');
SELECT * FROM jdbc.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插入数据:
INSERT INTO users1 (username,pid) VALUES ('小明',3);
INSERT INTO users1 (username,pid) VALUES ('小李',1);
INSERT INTO users1 (username,pid) VALUES ('李雷',2);
可以看到如图所示:
但是如果插入如下语句:
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表:
可以看到新插入的记录id不连续,因为虽然上一条记录插入失败,但编号已然增加过了!
好回到正题,将tb2中的一条记录删除看tb2表和user1表会有什么变化:
DELETE FROM tb2 WHERE id = 3;
然后得到下图:
tb2中id为3的记录被删除
而同时user1中的pid为3的记录也同时被删除(即user1中id为1的记录被删
除),这便是CASCADE