帮助,删除关系表

问题描述:

我有四个表:帮助,删除关系表

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

我该怎么办?

看起来一切正在按设计:)如果MySQL让你删除的用户,同时保留posts.user_id指向它,您的数据库将变得不一致。

如果你想从已删除用户的帖子是可读的,删除用户之前重置其USER_ID别的东西(0?空?)。

如果你想在用户信息保持过,那么你显然不能删除用户的行。您应该添加某种“用户已删除”列,以更改用户在用户界面上的显示方式。

+0

是的,你的第三个解决方案听起来不错。我在很多论坛上看到,当用户被删除时,他会在帖子中说“用户已删除”。 – ajsie 2009-12-28 06:22:19

外键用于强制执行数据完整性。既然你有理由让帖子和线程存在没有一个有效的用户ID,那么你并不需要外键数据的完整性。

我要么完全删除外键,要么利用foreign key creation clauseON DELETE部分。当引用的外部值发生更改时,您可以使用MySQL CASCADE,RESTRICT或​​。

在这种情况下,您可以使用ON DELETE SET NULL创建外键,并且在删除用户时,您的帖子表中的用户标识将设置为NULL。外键在默认情况下使用RESTRICT创建,这就是为什么您不能删除用户并在posts表中保留孤立值的原因。

这就是所谓的软删除,你可以在这里看到它在这里工作。当您看到来自“已删除”用户的答案时,它们会变灰。

保持用户在数据库中,但增加一个标志列isDeleted你当用户被删除设置。

然后(明显)禁止针对该用户的所有登录和(任选地)特别显示它们。

+0

+1:但列应该是ACCOUNT_STATUS_CODE,其外键为“ACCOUNT_STATUS_CODE”表。 – 2009-12-28 07:49:59

+0

为什么不是枚举? – 2009-12-28 19:36:52

实际上不要将外键约束添加到表中。他们没有必要。没有他们,你可以*地做任何你想做的事情。只有在必要时才添加它们。

+0

当然,但请考虑一下OP的情况。如果他们这样做,那么他们查询线程或发布的每个地方都必须在用户表上使用外部联接,然后检查是否有用户出现。 – Dan 2009-12-28 16:53:44