【问题标题】:Is this a job for Mysql Foreign Keys?这是 Mysql 外键的工作吗?
【发布时间】:2010-01-05 23:35:11
【问题描述】:

在过去的几年中,我阅读了很多关于 MySQL 中的外键的文章,但最近都没有。我知道它们很适合用于下面有子帖子的论坛主题,如果我删除一个有 100 个帖子连接到该主题的主题,外键将使它为我删除这 100 个主题,到目前为止我是否正确?

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

【问题讨论】:

    标签: php mysql foreign-keys


    【解决方案1】:

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

    也就是说,使用带有外键的级联删除可以满足您的要求,但请确保这是您真正想要发生的事情。如果给定用户删除了他们的帐户,您是否真的希望删除他们的所有帖子,以及所有回复到父帖子的帖子。

    您确实需要知道自己在做什么才能正确使用级联删除,而不是真正弄乱您的数据。

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        【解决方案3】:

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

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

        【讨论】:

          【解决方案4】:

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

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

          【讨论】:

            【解决方案5】:

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

            是的,这是外键的一个很好的用途。 FK 的主要目标是维护所谓的“参照完整性”,基本上,在您的情况下,确保用户某个表所引用的确实存在。您可以在删除具有CASCADE 属性的用户时选择所需的操作。您可以选择是否删除引用 FK 的行、将这些行上的 user_id 设为 null 或干脆停止删除查询。

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

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

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2011-10-03
              • 1970-01-01
              • 1970-01-01
              • 2018-01-26
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多