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

Cam*_*ata 17 mysql foreign-keys

我有两个表,一个'用户'和一个'订单',其中订单表具有对用户ID表的外键引用.(在这种情况下,我使用的是电子邮件地址作为用户ID.)

我想要完成的是:

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

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

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

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

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

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

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

Mar*_*ers 21

两种选择:

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

要么:

  • 删除外键约束.

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

  • Q和A都是+1 - 我对@Cambiata的NO ACTION有同样的想法.顺便说一下,[MySQL文档进一步解释了这一点](http://dev.mysql.com/doc/refman/5.5/en/innodb-foreign-key-constraints.html); 寻找"在MySQL中,相当于RESTRICT"的部分. (4认同)
  • 我知道了.我希望NO ACTION alternatvie意味着,好吧......没有动作.意思是当前值保持不变,表现得像正常的非fk值.显然不是!谢谢,马克! (3认同)
  • @Cambiata:没错,"纯粹的外键定义"是不可能的."外键"*表示*该值存在于另一个表中.如果您确实从另一个表中删除了引用的行,则必须通过以下方法删除外键值:a)删除整行(ON DELETE CASCADE),或b)将FK值设置为NULL(ON DELETE SET NULL) . (2认同)