帮助删除关系表

时间:2009-12-28 06:16:56

标签: sql mysql database-design data-modeling

我有四张桌子:

  • 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会抛出外键约束错误,我无法删除帖子,因为我希望所有帖子(和线程)都可以在那里读取,即使用户是删除。

我该怎么办?

4 个答案:

答案 0 :(得分:4)

这被称为软删除,你可以在SO上看到它正在工作。当您看到“已删除”用户的回答时,它们会显示为灰色。

将用户保留在数据库中,但添加在删除用户时设置的标记列isDeleted

然后(显然)禁止该用户的任何登录,并(可选)专门显示它们。

答案 1 :(得分:2)

看起来一切都按照设计工作:)如果MySQL让你删除用户,同时让posts.user_id指向它,你的数据库会变得不一致。

如果您希望删除用户的帖子可读,请在删除用户之前将其user_id重置为其他内容(0?NULL?)。

如果您希望保留用户信息,那么您显然无法删除用户行。您应该添加某种“用户被删除”列,以更改用户在UI上的显示方式。

答案 2 :(得分:0)

外键用于强制数据完整性。由于您有理由在没有有效用户ID的情况下存在帖子和帖子,因此您实际上并不需要外键数据完整性。

我要么完全删除外键,要么使用foreign key creation clauseON DELETE部分。当引用的外部值发生变化时,您可以拥有MySQL CASCADERESTRICTSET NULL

在这种情况下,您可以使用ON DELETE SET NULL创建外键,并在删除用户时在posts表中将用户ID设置为NULL。默认情况下,使用RESTRICT创建外键,这就是您无法删除用户并在posts表中保留孤立值的原因。

答案 3 :(得分:0)

实际上不要在表格中添加外键限制。它们不是必需的。没有他们,你可以自由地做任何你想做的事。只有在必要时才添加它们。