mysql外键更新规则_MySQL学习10:外键约束下的更新操作

上一篇只是讲述了外键约束的要求,并没有讲述外键约束的参照操作。这一次我来看看外键约束下的更新操作。 一外键约束的参照操作 我们进行外键约束的创建以后,在更新表的时候,子表是否也进行相应的更新。这是我们创建外键约束最大的好 处。有以下几种: 1)C

上一篇只是讲述了外键约束的要求,并没有讲述外键约束的参照操作。这一次我来看看外键约束下的更新操作。

一外键约束的参照操作

我们进行外键约束的创建以后,在更新表的时候,子表是否也进行相应的更新。这是我们创建外键约束最大的好

处。有以下几种:

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;

9acb97cd2ff8671c8d0acc50dcad421e.png

6b4a42822b27fe411920d8bda508c43b.png

(2)在父表provinces插入记录并且查看父表的记录信息:

INSERT provinces(pname) VALUES('A');

INSERT provinces(pname) VALUES('B');

INSERT provinces(pname) VALUES('C');

SELECT * FROM provinces;

a7b5ba32f457a3720c8ff9269629db70.png

(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;

58380502f35610a4ca367b47fd3b58a3.png

由上面结果知道:如果外键列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;

5c19fcf0880a54685749b3c8b7c94a8b.png

既然删除做到了,那么更新数据也会做到同样的效果,这里就不再进行举例说明。

四更新操作参考

(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实际开发过程中,列级约束使用的较多,表级约束很少使用。

本条技术文章来源于互联网,如果无意侵犯您的权益请点击此处反馈版权投诉

本文系统来源:php中文网

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值