如何删除MySQL InnoDB中的所有相关记录?

时间:2011-11-05 15:28:22

标签: mysql innodb myisam

好吧,我的朋友告诉我,我应该开始使用InnoDB作为我的数据库,所以我第一次尝试了。我在删除记录/索引/字段/表时遇到问题。每当我尝试删除记录时,我必须转到所有相关记录,删除它们然后返回删除我的原始记录。我根本无法删除索引!有没有更简单的方法(因为当我要用PHP运行时,它不会删除任何东西)或者我应该跳回MyISAM?您认为哪一项更好?

3 个答案:

答案 0 :(得分:3)

如果您希望在删除主表中的记录时自动删除相关记录,则需要在外键上指定ON DELETE CASCADE

根据手册,您选择的外键约束是其中之一:

  

CASCADE:从父表中删除或更新行,然后   自动删除或更新子表中的匹配行。   支持ON DELETE CASCADE和ON UPDATE CASCADE。之间   两个表,没有定义几个行动的ON UPDATE CASCADE子句   在父表或子表中的同一列上。

     

注意目前,级联外键操作不会激活触发器。

     

SET NULL:从父表中删除或更新行,并设置   子表中的外键列或列为NULL。两个都开   支持DELETE SET NULL和ON UPDATE SET NULL子句。

     

如果指定SET NULL操作,请确保尚未声明   子表中的列为NOT NULL。

     

RESTRICT:拒绝父表的删除或更新操作。   指定RESTRICT(或NO ACTION)与省略ON相同   DELETE或ON UPDATE子句。

     

NO ACTION:标准SQL中的关键字。在MySQL中,相当于   限制。 InnoDB拒绝父进程的删除或更新操作   表,如果引用的表中有相关​​的外键值。   有些数据库系统有延迟检查,NO ACTION是   延期检查。在MySQL中,检查外键约束   马上,所以NO ACTION和RESTRICT一样。

默认情况下,如果您没有指定任何内容,则为NO ACTION - 这就是您的删除现在没有做任何事情的原因。

答案 1 :(得分:2)

如果你喜欢删除很多东西,InnoDB可能不适合你。 InnoDB比MyISAM严格得多。在进行查询(SELECTSHOW等)时速度更快,但在进行更新时速度更慢(UPDATEINSERT等。)

InnoDB的CASCADE很神奇,但要非常小心。它也非常慢(因为db引擎本身将检查所有约束)。如果您正在处理级联到其他级联的记录,这些级联级联到其他更新级联到其他删除等等,您将等待很长时间。

如果您要删除 并且被InnoDB的限制所困扰,您可能会发现SET FOREIGN_KEY_CHECKS = 0;非常有用:

SET FOREIGN_KEY_CHECKS = 0;
/* do all kinds of dangerous deletes, eg. delete everything in the db */
SET FOREIGN_KEY_CHECKS = 1;

不要在应用程序本身中使用它,或者绝对确保不会破坏任何依赖项。

答案 2 :(得分:0)

这正是它应该如何运作的。

它保留了所谓的数据完整性。如果您有一个用户和一个与之关联的地址,除非您先删除地址,否则您无法删除用户 - 否则您将在数据库中留下杂散数据。

如果没有使用ON DELETE CASCADE来强制执行,您的应用程序应该确保删除所有相关数据。

通常innoDB更好地保留您的数据完整性,所以坚持下去并且不要回到myISAM(除非您给我们,否则每个引擎最好的问题也是如此更多细节没有必要留在那里)。