外键约束地狱

时间:2014-01-04 08:28:40

标签: mysql sql foreign-keys

我有一个包含用户,产品,品牌和类别的MySQL InnoDB数据库。

涉及很多外键 - 从用户,产品品牌,产品类别,品牌用户中添加产品......

每次我尝试删除记录时,外键约束都会失败,然后我会删除另一条记录,而另一条记录会由于其他原因而失败,并且它们都会纠缠不清。

这就是我设置它们的方式:

ON DELETE restrict
ON UPDATE cascade

我不知道为什么,我只是读到以这种方式设置它是好的。

我希望能够完美删除记录,我该怎么做?另一种方法的最终缺点是什么?与此不同?

2 个答案:

答案 0 :(得分:1)

正如您所使用的那样 -

ON DELETE RESTRICT

DBMS不允许您删除任何相关记录,而其他记录存在。要在删除父记录时删除所有子表中的所有相关记录,请使用

ON DELETE CASCADE

ON DELETE SET NULL

如果要将外键字段设置为NULL

来自doc -

  
      
  • CASCADE:从父表中删除或更新行,并自动删除或更新子表中的匹配行。   支持ON DELETE CASCADE和ON UPDATE CASCADE。之间   两个表,没有定义几个行动的ON UPDATE CASCADE子句   在父表或子表中的同一列上。注意:   目前,级联外键操作不会激活触发器。
  •   
  • RESTRICT:拒绝父表的删除或更新操作。指定RESTRICT(或NO ACTION)与省略   ON DELETE或ON UPDATE子句。
  •   
  • SET NULL:从父表中删除或更新行,并将子表中的外键列设置为NULL。支持ON DELETE SET NULL和ON UPDATE SET NULL子句。
  •   

答案 1 :(得分:-1)

只是不要使用外键constaints。问题解决了。

使用您喜欢的任何编程语言自行管理这类内容要容易得多,而不是试图让MySQL为您完成。

此外,您可以使用SET FOREIGN_KEY_CONSTRAINTS=0;暂时关闭外键约束。这就是Sequel Pro和phpMyAdmin等所做的事。