好吧,我的朋友告诉我,我应该开始使用InnoDB作为我的数据库,所以我第一次尝试了。我在删除记录/索引/字段/表时遇到问题。每当我尝试删除记录时,我必须转到所有相关记录,删除它们然后返回删除我的原始记录。我根本无法删除索引!有没有更简单的方法(因为当我要用PHP运行时,它不会删除任何东西)或者我应该跳回MyISAM?您认为哪一项更好?
答案 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严格得多。在进行查询(SELECT
,SHOW
等)时速度更快,但在进行更新时速度更慢(UPDATE
,INSERT
等。)
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
(除非您给我们,否则每个引擎最好的问题也是如此更多细节没有必要留在那里)。