欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  数据库

MySQL学习10:外键约束下的更新操作

程序员文章站 2022-05-15 21:29:14
...

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

MySQL学习10:外键约束下的更新操作

MySQL学习10:外键约束下的更新操作

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

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

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

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

SELECT * FROM provinces;

MySQL学习10:外键约束下的更新操作

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

MySQL学习10:外键约束下的更新操作

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

MySQL学习10:外键约束下的更新操作

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

四更新操作参考

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