我有四张桌子:
users
:id,thread_id threads
:id,language_id posts
:id,user_id,language_id languages
:id USERS.thread_id是THREADS.id的外键,POSTS.user_id是USERS.id的外键和LANGUAGES.id的POSTS.language_id外键。
我无法删除用户,因为POSTS.user_id会抛出外键约束错误,我无法删除帖子,因为我希望所有帖子(和线程)都可以在那里读取,即使用户是删除。
我该怎么办?
答案 0 :(得分:4)
这被称为软删除,你可以在SO上看到它正在工作。当您看到“已删除”用户的回答时,它们会显示为灰色。
将用户保留在数据库中,但添加在删除用户时设置的标记列isDeleted
。
然后(显然)禁止该用户的任何登录,并(可选)专门显示它们。
答案 1 :(得分:2)
看起来一切都按照设计工作:)如果MySQL让你删除用户,同时让posts.user_id指向它,你的数据库会变得不一致。
如果您希望删除用户的帖子可读,请在删除用户之前将其user_id重置为其他内容(0?NULL?)。
如果您希望保留用户信息,那么您显然无法删除用户行。您应该添加某种“用户被删除”列,以更改用户在UI上的显示方式。
答案 2 :(得分:0)
外键用于强制数据完整性。由于您有理由在没有有效用户ID的情况下存在帖子和帖子,因此您实际上并不需要外键数据完整性。
我要么完全删除外键,要么使用foreign key creation clause的ON DELETE
部分。当引用的外部值发生变化时,您可以拥有MySQL CASCADE
,RESTRICT
或SET NULL
。
在这种情况下,您可以使用ON DELETE SET NULL
创建外键,并在删除用户时在posts表中将用户ID设置为NULL。默认情况下,使用RESTRICT
创建外键,这就是您无法删除用户并在posts表中保留孤立值的原因。
答案 3 :(得分:0)
实际上不要在表格中添加外键限制。它们不是必需的。没有他们,你可以自由地做任何你想做的事。只有在必要时才添加它们。