这可能是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)