这个问题在标题中!
我用来存储我(生产)网站上的数据的数据库包含很多ON DELETE CASCADE
。
我只是想知道这是一件好事还是更好的手动编码所有删除的方式。
一方面,它不是非常明确:删除是由魔术完成的,另一方面,它使开发变得更容易:我不必在脑海中保留数据库的整个模式。
答案 0 :(得分:1)
我认为保持参照完整性是一件好事。您想要的最后一件事是数据库中的孤立行。
有关不使用参照完整性时要考虑的事项,请参阅MySQL文档:
MySQL为数据库开发人员提供了使用哪种方法的选择。如果您不需要外键并希望避免与强制引用完整性相关的开销,则可以选择其他存储引擎,例如MyISAM。 (例如,MyISAM存储引擎为仅执行INSERT和SELECT操作的应用程序提供了非常快的性能。在这种情况下,表中间没有孔,插入可以与检索同时执行。请参见第8.10.3节, “并发插入”。)
如果您选择不利用参照完整性检查,请记住以下注意事项:
在没有服务器端外键关系检查的情况下,应用程序本身必须处理关系问题。例如,必须注意以正确的顺序将行插入表中,并避免创建孤立的子记录。它还必须能够从多记录插入操作中发生的错误中恢复。
如果ON DELETE是应用程序所需的唯一参照完整性功能,则可以使用多表DELETE语句通过单个语句从多个表中删除行,从而实现与MySQL Server 4.0类似的效果。请参见第13.2.2节“删除语法”。
缺少ON DELETE的解决方法是在从具有外键的表中删除记录时向应用程序添加适当的DELETE语句。实际上,这通常与使用外键一样快,而且更便携。
请注意,使用外键有时会导致问题:
外键支持解决了许多参照完整性问题,但仍然需要仔细设计关键关系以避免循环规则或级联删除的错误组合。
DBA创建关系拓扑并且很难从备份中恢复单个表的情况并不少见。 (MySQL通过允许您在重新加载依赖于其他表的表时暂时禁用外键检查来缓解此困难。请参见第14.3.5.4节“FOREIGN KEY约束”。从MySQL 4.1.1开始,mysqldump生成利用转储文件在重新加载时自动执行此功能。)
来源:http://dev.mysql.com/doc/refman/5.5/en/ansi-diff-foreign-keys.html
答案 1 :(得分:0)
级联删除是一个很好的工具供您使用,前提是您确保只在完全合理的情况下使用它们。
您选择使用级联删除的主要情况是,您有一个表,该表对另一个表中的一个(且仅一个)行“拥有”的实体进行建模。例如,如果您有一个为人物建模的表格和一个为电话号码建模的表格。在这里,您的电话号码表将为您的人员表提供外键。现在,如果您决定不再希望您的应用程序跟踪某人 - 比如“道格拉斯” - 那么您也不想再跟踪道格拉斯的电话号码了。在你的数据库中有一个电话号码,并且不知道它是谁,这是没有意义的。
但与此同时,当您想要从“人员”表中删除某个人时,您不希望首先必须费力地检查您是否有该人的电话号码并将其删除。为什么当你可以在数据库结构中编码一个规则,当一个人被删除时,他们的电话号码也可以一样?这就是级联删除将为您做的事情。只要确保你知道级联删除了什么,并且它们都有意义。
NB。如果使用触发器,则需要更加小心。 MySQL不会在级联删除时触发触发器。