打赏

外键约束的参照操作(十八)

 

 

 

 

 

外键约束的参照操作

  1 CASCADE:从父表删除或更新且自动删除或更新子表中匹配的行。

  2SET NULL:从父表删除或更新行,并设置子表中的外键列为NULL。如果使用该选项,必须保证子表列没有指定NOT NULL。

  3 RESTRICT:拒绝对父表的删除或更新操作。

  4NO 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关键字。

 

posted @ 2017-03-11 15:28  大数据和AI躺过的坑  阅读(1016)  评论(0编辑  收藏  举报