这是否需要使用Mysql外键?

3
在过去的几年中,我阅读了很多关于MySQL中外键的文章,但都比较旧。我知道在像带有子帖子的论坛主题这样的情况下使用它们是很好的,如果我删除与该主题相关的100个帖子,外键将帮助我删除这些100个帖子,目前为止我是正确的吗?
我正在使用php/mysql开发一个社交网络,有一个用户表格,其中包含一个用户ID,然后还有大约10个其他表格通过该用户ID字段连接到该表格。我应该在这上使用外键吗?我永远不需要更新所有的表格,但例如,如果用户删除他们的账户,以前我会让PHP运行大约10个删除查询,每个表格上都要执行一次。在这种情况下使用外键是否合适?
5个回答

3
外键并不执行删除数据的工作。它们确保您不会向父表中无效的字段输入数据。例如,如果在用户表中没有UserId 100,则无法在子表中输入具有UserId 100的记录。
话虽如此,使用外键进行级联删除将实现您要求的功能,但请确保这正是您想要发生的。如果他们删除帐户,您真的想要删除给定用户的所有帖子以及所有回复帖子直到整个线程吗?
要正确使用级联删除,您需要真正了解自己在做什么,以避免破坏数据。

1
如果您正在使用外键,您可以指定MySQL在引用记录删除时执行参考操作。例如,在外键字段上指定“CASCADE”将告诉MySQL删除引用表中主键的任何记录。当其他表中所引用的记录被删除时,“SET NULL”参考操作将把外键字段设置为NULL。

1

最重要的是,外键 是两个表之间的引用约束。

如果您有带有 on delete cascade 的 InnoDB 表(请参见 13.6.4.4. FOREIGN KEY Constraints),它可以用于实现您所描述的内容,但这绝不是您应该使用外键的首要原因。


0
如果我删除一个有100个帖子连接到该主题的主题,外键将使我删除这100个主题,我目前是正确的吗?
这取决于您是否设置了级联删除。级联删除可能很好,但您必须彻底了解其影响,因为一个删除可能会导致“重大”事件发生。但是,是的,如果您的目标是使用单个删除删除记录层次结构,则具有级联删除的外键是可行的选项。

0
我永远不需要更新所有的表,但例如,如果用户删除他们的帐户,过去我会让PHP在每个表上运行10个删除查询,为该用户在每个表上运行1个。这听起来像是使用外键的好方法吗?
是的,这是外键的一个很好的用途。FK的主要目标是维护所谓的“引用完整性”,基本上,在您的情况下,确保某个表所引用的用户确实存在。您可以选择使用“级联”属性时删除用户时要执行的操作。您可以选择删除引用FK的行,将这些行上的user_id设置为null,或者仅停止删除查询的执行。

http://dev.mysql.com/doc/refman/5.1/en/innodb-foreign-key-constraints.html

顺便提一下,MyISAM 不支持外键,它会默默地忽略它们。你应该使用 InnoDB。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接