Mysql 从表中删除行:“引用”;无法删除或更新父行:外键约束失败;这是一个外键问题还是CASCADE将完成这项工作?

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

我想从“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` 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个以上的关键字(“关键字”表)
  • 每个“关键字”都有多个“数据”行
  • 每个“产品”只有一个用户
  • 每个“产品”都有多个“产品数据”
为了确定起见,下面是一个简短的解释:

“key_prod”显然是“keywords”表中的外键,“prod_id”是“prods”表中的“主键”

我现在很困惑

编辑#2:

这是我找到的另一个解决方案,不太确定如何在我的代码中应用它,但无论如何:

简单的方法是禁用外键检查;使 更改,然后重新启用外键检查

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;