上一篇只是讲述了外键约束的要求,并没有讲述外键约束的参照操作。这一次我来看看外键约束下的更新操作。
一外键约束的参照操作 我们进行外键约束的创建以后,在更新表的时候,子表是否也进行相应的更新。这是我们创建外键约束最大的好
处。有以下几种:
1)cascade:从父表删除或更新且自动删除或更新子表中匹配的行。
2)set null:从父表删除或更新行,并设置子表中的外键列为null。如果使用该选项,必须保证子表列没有指
定not null。
3)restrict:拒绝对父表的删除或更新操作。
4)no action:标准sql的关键字,在mysql中与restrict相同。
二更新外键约束的字段准备工作 (1)创建一个子表users1 create table users1(
id smallint unsigned primary key auto_increment,
username varchar(10) not null,
pid smallint unsigned,
foreign key (pid) references provinces (id) on delete cascade
);
show create table users1;
(2)在父表provinces插入记录并且查看父表的记录信息: insert provinces(pname) values('a');
insert provinces(pname) values('b');
insert provinces(pname) values('c');
select * from provinces;
(3)在子表users1插入记录: insert users1(username,pid) values('tom',3);
insert users1(username,pid) values('john',3);
insert users1(username,pid) values('tom',6);
insert users1(username,pid) values('rose',1);
select * from users1;
由上面结果知道:如果外键列pid字段的数字大于3就不会插入记录,这是因为外键列pid字段参照的是父表
provinces中的参照列id字段,既然父表中id字段只存在3条,那么子表users1中插入的pid字段当然不能大于3;但是插
入记录会存在索引,这就是上面结果显示的原因,也是id字段为1,2,4的原因。
三外键约束下的删除操作 假设我们把provinces数据表中的id=3的记录删除
delete from provinces where id=3;
select * from provinces;
select * from users1;
既然删除做到了,那么更新数据也会做到同样的效果,这里就不再进行举例说明。
四更新操作参考 (1)on delete操作 restrict(约束):当在父表(即外键的来源表)中删除对应记录时,首先检查该记录是否有对应外键,如果有则不
允许删除。
no action:意思同restrict,即如果存在从数据,不允许删除主数据。
cascade(级联):当在父表(即外键的来源表)中删除对应记录时,首先检查该记录否有对应外键,如果有则也删
除外键在子表(即包含外键的表)中的记录。
set null:当在父表(即外键的来源表)中删除对应记录时,首先检查该记录是否有对应外键,如果有则设置子表
中该外键值为null(不过这就要求该外键允许取null)。
(2)on update操作 restrict(约束):当在父表(即外键的来源表)中更新对应记录时,首先检查该记录是否有对应外键,如果有则
不允许更新。
no action:意思同restrict。
cascade(级联):当在父表(即外键的来源表)中更新对应记录时,首先检查该记录是否有对应外键,如果有则也
更新外键在子表(即包含外键的表)中的记录。
set null:当在父表(即外键的来源表)中更新对应记录时,首先检查该记录是否有对应外键,如果有则设置子
表中该外键值为null(不过这就要求该外键允许取null)。
注:no action和restrict的区别:只有在及个别的情况下会导致区别,前者是在其他约束的动作之后执
行,后者具有最高的优先权执行。
五表级约束与列级约束 按照参照数目的多少来划分:分为表级约束和列级约束。
对一个数据列建立的约束,称为列级约束。列级约束既可以在列定义时声明,也可以在列定义后声明。
对多个数据列建立的约束,称为表级约束。表级约束只能在列定义后声明。
使用表级约束和列级约束需要注意的是:
1not null约束和default约束不存在表级约束。其余的约束都存在列级约束和表级约束。
2实际开发过程中,列级约束使用的较多,表级约束很少使用。
