Mysql 从表中删除行:“引用”;无法删除或更新父行:外键约束失败;这是一个外键问题还是CASCADE将完成这项工作?
我想从“prods”表中删除一行。每当我删除一行时,我希望它删除与之关联的其他表中的行 每当我尝试使用我的PHP代码从“prods”中删除一行时,就会出现以下错误:Mysql 从表中删除行:“引用”;无法删除或更新父行:外键约束失败;这是一个外键问题还是CASCADE将完成这项工作?,mysql,database,foreign-keys,cascading-deletes,Mysql,Database,Foreign Keys,Cascading Deletes,我想从“prods”表中删除一行。每当我删除一行时,我希望它删除与之关联的其他表中的行 每当我尝试使用我的PHP代码从“prods”中删除一行时,就会出现以下错误: A Database Error Occurred Error Number: 1451 Cannot delete or update a parent row: a foreign key constraint fails (`tools`.`keywords`, CONSTRAINT `keywords_ibfk_1` F
A Database Error Occurred
Error Number: 1451
Cannot delete or update a parent row: a foreign key constraint fails (`tools`.`keywords`, CONSTRAINT `keywords_ibfk_1` FOREIGN KEY (`key_prod`) REFERENCES `prods` (`prod_id`))
我在“关键字”表中也得到了同样的结果——通过删除“数据”表中“相关”的行,然后从“关键字”表中删除该行,解决了这个问题
但是,当我在从“prods”表中删除一行时再次遇到这个问题时,我注意到这不能像这样工作,必须有一种更有效的方法来做到这一点
在谷歌搜索了一点之后,我发现我可能可以使用“删除级联”——这可能会导致问题(或者删除不需要的行)。我真的不知道它是否会——所以我对这一点做了更多的研究。以下是我找到这篇文章的其他搜索结果:
在那里,他被告知外键没有正确使用——他必须在外键和外键之间进行交换,这将解决他的问题
我对处理复杂的数据库还不熟悉,我想知道我的方法是否正确——所有外键都正确,如果我使用DELETE CASCADE
将正确完成这项工作
这是我的数据库转储结构(MySQL):
你能告诉我外键是否做对了吗?当然,我应该改变我的结构吗
在这种情况下,“级联”能正常工作吗
非常感谢
编辑:
这就是造成所有问题的原因吗
ALTER TABLE `keywords`
ADD CONSTRAINT `keywords_ibfk_1` FOREIGN KEY (`key_prod`) REFERENCES `prods` (`prod_id`);
如果是,在当前状态下,我的数据库中当前有所有数据,如何取消此操作并在没有错误的情况下翻转它
有关当前结构的更多信息:
- 每个“产品”都有1个以上的关键字(“关键字”表)李>
- 每个“关键字”都有多个“数据”行李>
- 每个“产品”只有一个用户李>
- 每个“产品”都有多个“产品数据”
SET FOREIGN_KEY_CHECKS=0; -- to disable them
SET FOREIGN_KEY_CHECKS=1; -- to re-enable them
我不确定这是一种变通方法,还是一种解决此类问题的真正方法,我真的希望我的代码能够“按部就班”地工作,尤其是当我刚开始使用此类东西时 我曾参与过类似的数据库项目。首先备份数据库 试着放下你的外键
ALTER TABLE table_name DROP FOREIGN KEY column_name_ibfk_1;
之后,您现在可以创建一个外键来执行上述操作
ALTER TABLE table_name ADD FOREIGN KEY(column_name) REFERENCES table_name(column_name) ON DELETE CASCADE ON UPDATE CASCADE;
像这样<代码>更改表'keywords'添加外键('KEY_prod_ibfk_1')在更新级联的删除级联上引用'prods'('prod_id')所以它实际上就像在主要帖子中提到的原始版本,但是没有
约束
?两者之间的区别是什么?我使用PHPMYADMIN创建了外键。为什么不同?外键约束没有区别,不管它是使用phpmyadmin创建的,还是从CLI或其他创建的,除非您决定在更新级联上添加DELETE级联。如果正确创建了外键,则可以决定如何处理主外键字段数据操作。如果您使用的是phpmyadmin,请转到包含外键的表。单击结构->关系视图。向下滚动。在那里,您可以添加外键并决定“级联”。
ALTER TABLE table_name ADD FOREIGN KEY(column_name) REFERENCES table_name(column_name) ON DELETE CASCADE ON UPDATE CASCADE;