外键约束的参照操作
1 ▶ CASCADE:从父表删除或更新且自动删除或更新子表中匹配的行。
2 ▶ SET NULL:从父表删除或更新行,并设置子表中的外键列为NULL。如果使用该选项,必须保证子表列没有指定NOT NULL。
3 ▶ RESTRICT:拒绝对父表的删除或更新操作。
4 ▶ NO ACTION:标准SQL的关键字,在MYSQL中 和RESTRICT相同。
例如:我们参照provinces表来创建一张user1表,如下图
create table user1( id smallint unsigned primary key auto_increment, username varchar(10) not null, pid smallint unsigned, foregin key (pid) references provinces (id) on delete cascade );
在我们父表中,进行删除与更新记录的同时,也删除和更新子表中对应的记录。
注意:要先在父表中插入数据,再这子表中插入数据。
原因是:因为子表是参照父表中的信息,若父表中都不存在某个信息了,自然子表更加没啦!
要明确,在父表provinces里,是id和pname 。其中id是自动,所以我们只需插入pname即可。
insert provinces(pname) values('A')
insert provinces(pname) values('B')
insert provinces(pname) values('C')
select * from provinces;
insert user1(username,pid) values('zhaosi',3); insert user1(username,pid) values('liuneng',5); insert user1(username,pid) values('liuneng',1); insert user1(username,pid) values('xiaomeng',2);
3是省份id为3的字段
咦,为什么id是1,3,4呢?而不是1,2,3?
答:因为,刚我们故意有条记录没写成功,但它编号的自动增加的。
现在,我们把父表provinces中id为3的记录,删除掉。看对应user1子表中pid=3的记录是否也会被删除?果然删除了。
delete from provinces where id=3;
select * from provinces;
select * from user1;
即 1 ▶ CASCADE:从父表删除或更新且自动删除或更新子表中匹配的行。(测试完成)
2 ▶ SET NULL:从父表删除或更新行,并设置子表中的外键列为NULL。如果使用该选项,必须保证子表列没有指定NOT NULL。(自行去测试啊)
3 ▶ RESTRICT:拒绝对父表的删除或更新操作。(自行去测试啊)
4 ▶ NO ACTION:标准SQL的关键字,在MYSQL中 和RESTRICT相同。(自行去测试啊)
总结
(1)实际,在生产里,我们很少去物理的外界约束,而往往是使用逻辑的外界约束。
因为,物理的外界约束只有InnoDA这样的引擎才支持,而MyISAM等不支持。
(2)实际,在生产里,在定义两张表的结构时,我们是按照两张表存在的某种结构的方式去定义,但是不去使用,foregin key关键字。