我有两个表,一个是'users',另一个是'orders',其中order表有一个对用户id表的外键引用。 (在这种情况下,我使用电子邮件地址作为用户ID。)
我想要完成的是:
如果更新了用户表ID(=更改了电子邮件地址),则这将反映在引用的订单表user_id字段中。 (使用ON UPDATE CASCADE指令可以正常工作 - 这里没问题!)
如果从用户表中删除用户,则订单将保留,保留引用的user_id。
我遇到了第二个目标的问题:
如果我在引用的用户ID字段上使用ON DELETE CASCADE,则订单行当然会被删除。
如果我使用ON DELETE NO ACTION,当我尝试删除用户时出现错误。 (#1451 - 无法删除或更新父行:外键约束失败)
如果我使用ON DELETE SET NULL,我可以删除用户行,但引用的信息设置为null,因此我无法追踪是谁下了订单......
是否有办法允许从用户表中删除用户,同时在订单表中保留引用的user_id信息?
答案 0 :(得分:20)
两个选项:
deleted
字段即可将其标记为已删除。或:
我会推荐第一个选项。采用第二种选择可能导致数据不一致。此外,只要拥有密钥的值而没有其他表中的相应数据,无论如何都无济于事。
答案 1 :(得分:0)
实际上还有另一种选择 - 用自动增量INT替换用户表的电子邮件地址密钥。
然后你可以将用户属性(ugh,denormalized)复制到订单中(我猜你可以证明它是订购时订购用户的'电子邮件地址')。
然后ON DELETE SET NULL可以重置外键INT而不是复制的属性(电子邮件地址)。