当前位置:Gxlcms > mysql > MySQL学习10:外键约束下的更新操作

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

时间:2021-07-01 10:21:17 帮助过:66人阅读

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



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


人气教程排行