这是Mysql外键的工作吗?

时间:2010-01-05 23:35:12

标签: php mysql foreign-keys

在过去的几年里,我已经阅读了很多关于MySQL中的外键的文章,但最近没有。我知道他们很喜欢使用类似论坛主题的东西,如果我删除了100个帖子连接到该主题的主题,外键会让它删除那100个主题,我到目前为止是正确的?

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

5 个答案:

答案 0 :(得分:3)

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

使用Cascading Deletes和外键说会做你想要的,但要确保这是你真正想要发生的事情。您是否真的希望删除给定用户的所有帖子,如果他们删除了他们的帐户,并且所有回复帖子一直发布到主帖子。

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

答案 1 :(得分:1)

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

答案 2 :(得分:1)

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

如果您的InnoDB表包含on delete cascade (请参阅13.6.4.4. FOREIGN KEY Constraints,它可用于实现您所描述的内容,但这绝对不是第一个原因你应该使用外键。

答案 3 :(得分:0)

  

如果我删除100个帖子的主题   连接到该主题,外键   将删除这100个主题   对我来说,到目前为止我是否正确?

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

答案 4 :(得分:0)

  

我不需要更新所有内容   表,但例如,如果用户   删除那里帐户,过去我   会让PHP像10删除一样运行   查询,每个表上为用户1。   这听起来像是一件好事   使用外键?

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

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

顺便说一句,MyISAM不支持FK,它会默默地忽略它们。你应该使用InnoDB。