Mysql 删除级联表 以下为引用https://blog.csdn.net/yabingshi_tech/article/details/52290124 MYSQL: Cannot delete or update a parent row: a foreign key constraint fails

以下为引用https://blog.csdn.net/yabingshi_tech/article/details/52290124

MYSQL: Cannot delete or update a parent row: a foreign key constraint fails
这可能是MySQL在InnoDB中设置了foreign key关联,造成无法更新或删除数据。可以通过设置FOREIGN_KEY_CHECKS变量来避免这种情况。 

SET FOREIGN_KEY_CHECKS = 0; 
删除完成后设置 
SET FOREIGN_KEY_CHECKS = 1; 

具体示例:

执行下面这个语句时报错:
update dba.`dept` set deptno=1110 where deptno=10;
报错:

Error Code: 1451
Cannot delete or update a parent row: a foreign key constraint fails (`dba`.`employee2`, CONSTRAINT `FK94B9B0D6893F4F00` FOREIGN KEY (`deptno`) REFERENCES `dept` (`deptno`))

同理,当更新子表deptno=10的记录时也会报这个错误。

错误信息显示dba.employee2这个表有个外键约束,引用了dept表的deptno字段。

当子表中包含该数据,更新时则会报错。子表不包含该数据时,更新父表是不会报错的。

/*
也可以通过sql查询外键引用关系:
SELECT * 
FROM information_schema.`KEY_COLUMN_USAGE`
WHERE referenced_table_name='dept'
 AND referenced_column_name='deptno'
 AND referenced_table_schema='dba';

*/
想要删除父表的数据,需要先禁用外键约束检查:
SET FOREIGN_KEY_CHECKS = 0; 
再执行更新语句即可

update dba.`dept` set deptno=1110 where deptno=10;

为了确保子表和父表数值一致,也要更新子表相应字段值:

update dba.employee2 set deptno=1110 where deptno=10;

题外话:

要想建立外键,必须确保父表中被引用的字段上创建了索引。否则,子表在创建外键时会报错:

Error Code: 1005
Can't create table 'dba.#sql-9d8_25' (errno: 121)

猜你喜欢

转载自blog.csdn.net/qq_35811626/article/details/80426345