2010-01-05 95 views
3

在过去的几年中,我已经阅读了大量关于MySQL中外键的文章,但最近没有。我知道,如果我删除了一个有100个帖子连接到该主题的主题,外键会让它为我删除这100个主题,但我知道他们很适合使用类似论坛主题的子帖子。 ?这是Mysql外键的工作吗?

我正在使用php/mysql的社交网络,有一个用户ID和用户ID,然后有大约10个其他表通过该用户ID字段连接到该表,我应该使用外部在这个关键?我永远不需要更新所有的表,但是例如,如果用户删除了那里的账户,过去我会让PHP运行10个删除查询,每个表上的用户数为1。这听起来像是一个很好的工作,使用外键?

回答

3

外键不执行删除数据的工作。它们确保您不会将数据输入到父表中无效的字段中。即如果用户表中没有UserId 100,则您将无法在子表中输入UserId 100的记录。

这就是说使用级联删除与外键将做你在问什么,但要确保这是你真正想要发生的事情。你是否真的希望删除给定用户的所有帖子,如果他们删除了他们的账户,并且所有回复帖子都发布到了帖子的最后。

你真的需要知道你在做什么来正确使用级联删除,而不是真的搞乱了你的数据。

0

,如果我删除与100后的 连接到该话题,外键的话题 将使删除这些100个主题 对我来说,我是正确的那么远?

这取决于您是否有级联删除设置。级联删除可能很好,但你必须彻底了解这些后果,因为一次删除会导致“重大”事情发生。但是,是的,如果您的目标是通过一次删除删除记录的层次结构,那么具有级联删除的外键是一个可行的选项。

1

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

1

最重要的是,Foreign Key是两个表之间的参照约束。

它可以用来实现你的描述,如果有InnoDB表与on delete cascade(见13.6.4.4. FOREIGN KEY Constraints,但这是definitly不是你应该使用外键的第一个原因。

0

我永远不会需要更新所有的 表,但对于例如,如果用户 删除有帐号,过去我 将有像10的PHP运行删除 查询,各1个表用户。 这听起来像一个很好的工作是 使用外键吗?

是的,这是一个很好用的外键。 FKs的主要目标是保持所谓的“参照完整性”,基本上,在你的情况下,以确保用户某个表引用肯定存在。使用CASCADE属性删除用户时,您可以选择所需的操作。您可以选择是删除引用FK的行,还是删除这些行上的user_id,或者只是停止删除查询。

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

顺便说一句,MyISAM不支持FKS,它将忽略它们。你应该使用InnoDB。