美文网首页
外键约束的参照

外键约束的参照

作者: steamed_bun | 来源:发表于2016-11-09 17:36 被阅读0次
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相同

相关文章

网友评论

      本文标题:外键约束的参照

      本文链接:https://www.haomeiwen.com/subject/lffiuttx.html