MySql外键:ON DELETE NO ACTION行为 - 如何在引用字段中保留信息?

时间:2011-09-22 08:00:19

标签: mysql foreign-keys

我有两个表,一个是'users',另一个是'orders',其中order表有一个对用户id表的外键引用。 (在这种情况下,我使用电子邮件地址作为用户ID。)

我想要完成的是:

  1. 如果更新了用户表ID(=更改了电子邮件地址),则这将反映在引用的订单表user_id字段中。 (使用ON UPDATE CASCADE指令可以正常工作 - 这里没问题!)

  2. 如果从用户表中删除用户,则订单将保留,保留引用的user_id。

  3. 我遇到了第二个目标的问题:

    如果我在引用的用户ID字段上使用ON DELETE CASCADE,则订单行当然会被删除。

    如果我使用ON DELETE NO ACTION,当我尝试删除用户时出现错误。 (#1451 - 无法删除或更新父行:外键约束失败)

    如果我使用ON DELETE SET NULL,我可以删除用户行,但引用的信息设置为null,因此我无法追踪是谁下了订单......

    是否有办法允许从用户表中删除用户,同时在订单表中保留引用的user_id信息?

2 个答案:

答案 0 :(得分:20)

两个选项:

  • 实际上不要删除用户,只需设置deleted字段即可将其标记为已删除。

或:

  • 删除外键约束。

我会推荐第一个选项。采用第二种选择可能导致数据不一致。此外,只要拥有密钥的值而没有其他表中的相应数据,无论如何都无济于事。

答案 1 :(得分:0)

实际上还有另一种选择 - 用自动增量INT替换用户表的电子邮件地址密钥。

然后你可以将用户属性(ugh,denormalized)复制到订单中(我猜你可以证明它是订购时订购用户的'电子邮件地址')。

然后ON DELETE SET NULL可以重置外键INT而不是复制的属性(电子邮件地址)。