-->
当前位置:首页 > DayDayUp > 正文内容

mysql删除修改记录报错:Cannot delete or update a parent row:a foreign key constraint fails. 外键约束失败

Luz3年前 (2022-01-22)DayDayUp4904

mysql删除记录报错

Cannot delete or update a parent row:a foreign key constraint fails......  ON DELETE NO ACTION ON UPDATE NO ACTION


image.png

报错为外键约束失败


外键约束

外键(FOREIGN KEY)为表的一个特殊字段,常与主键约束同时使用。对于两个具有关联关系的表而言,相关联字段中主键所在的表就是主表(父表),外键所在的表就是从表(子表)。
外键用来建立主表与从表的关联关系,为两个表的数据建立连接,约束两个表中数据的一致性和完整性。比如,一个水果摊,只有苹果、桃子、李子、西瓜等 4 种水果,那么,你来到水果摊要买水果就只能选择苹果、桃子、李子和西瓜,其它的水果都是不能购买的。
主表删除某条记录时,从表中与之对应的记录也必须有相应的改变。一个表可以有一个或多个外键,外键可以为空值,若不为空值,则每一个外键的值必须等于主表中主键的某个值。

定义外键时,需要遵守下列规则:

主表必须已经存在于数据库中,或者是当前正在创建的表。如果是后一种情况,则主表与从表是同一个表,这样的表称为自参照表,这种结构称为自参照完整性。

必须为主表定义主键。

主键不能包含空值,但允许在外键中出现空值。也就是说,只要外键的每个非空值出现在指定的主键中,这个外键的内容就是正确的。

在主表的表名后面指定列名或列名的组合。这个列或列的组合必须是主表的主键或候选键。

外键中列的数目必须和主表的主键中列的数目相同。

外键中列的数据类型必须和主表主键中对应列的数据类型相同。


处理方式

1.临时禁用外键检查

mysql> SET FOREIGN_KEY_CHECKS = 0;  # 临时禁用

mysql>需要执行的mysql语句(delete/update...)

mysql> SET FOREIGN_KEY_CHECKS = 1;  #恢复


2.删除与此表外键关联的表(不推荐)

直接DROP 表名

3.将表更新方式设置为级联(根治)

撤销原有的外键约束

ALTER TABLE table1
DROP FOREIGN KEY 外键名

重新设置约束,注意设置成CASCADE

ALTER TABLE tablename
ADD CONSTRAINT 外键名
FOREIGN KEY (s_id)
REFERENCES student(s_Id) ON DELETE CASCADE ON UPDATE CASCADE;

最后执行修改删除的sql语句,此时主表更新后从表也会同步更新



mysql表更新方式

1.cascade:级联,当父表更新、删除,子表会同步更新和删除

2.set null:置空,当父表更新、删除的时候,字表会把外键字段变为null,所以这个时候设计表的时候该字段要允许为null,否则会出错

3.restrict:父表在删除和更新记录的时候,要在子表中检查是否有有关该父表要更新和删除的记录,如果有,则不允许删除个更改

4.no action:和restrict一样


发表评论

访客

◎欢迎参与讨论,请在这里发表您的看法和观点。