Sql 删除关系表的帮助

Sql 删除关系表的帮助,sql,mysql,database-design,data-modeling,Sql,Mysql,Database Design,Data Modeling,我有四张桌子: 用户:id,线程\u id 线程:id,语言\u id 帖子:id、用户id、语言id 语言:id USERS.thread\u id是THREADS.id的外键,POSTS.user\u id是USERS.id的外键,POSTS.language\u id是LANGUAGES.id的外键 我无法删除用户,因为POSTS.user_id将抛出外键约束错误,并且我无法删除该帖子,因为我希望即使用户被删除,所有帖子(和线程)都在那里可读 我该怎么办?看起来一切正常:)如果MySQ

我有四张桌子:

  • 用户
    :id,线程\u id
  • 线程
    :id,语言\u id
  • 帖子
    :id、用户id、语言id
  • 语言
    :id
USERS.thread\u id是THREADS.id的外键,POSTS.user\u id是USERS.id的外键,POSTS.language\u id是LANGUAGES.id的外键

我无法删除用户,因为POSTS.user_id将抛出外键约束错误,并且我无法删除该帖子,因为我希望即使用户被删除,所有帖子(和线程)都在那里可读


我该怎么办?

看起来一切正常:)如果MySQL允许您在保留posts.user\u id指向该用户时删除该用户,您的数据库将变得不一致

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


如果希望用户信息也保留下来,那么显然不能删除用户行。您应该添加某种类型的“user is deleted”(用户已删除)列,以更改用户在UI上的显示方式。

看起来一切正常:)如果MySQL允许您在留言时删除该用户。用户id指向该用户,则您的数据库将变得不一致

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


如果希望用户信息也保留下来,那么显然不能删除用户行。您应该添加某种类型的“用户已删除”列,以更改用户在UI上的显示方式。

外键用于强制执行数据完整性。由于您有理由让POST和线程在没有有效用户id的情况下存在,因此您并不真正需要外键数据完整性

我要么完全删除外键,要么利用。当引用的外部值更改时,您可以使用MySQL
CASCADE
RESTRICT
、或
SET NULL


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

外键用于强制数据完整性。由于您有理由让POST和线程在没有有效用户id的情况下存在,因此您并不真正需要外键数据完整性

我要么完全删除外键,要么利用。当引用的外部值更改时,您可以使用MySQL
CASCADE
RESTRICT
、或
SET NULL


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

这称为软删除,您可以在此处看到它的作用。当您看到来自“已删除”用户的答案时,它们将灰显

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


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

这称为软删除,您可以在此处看到它的作用。当您看到来自“已删除”用户的答案时,它们将灰显

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


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

实际上不要将外键限制添加到表中。它们不是必需的。没有他们,你可以随心所欲。仅在必要时添加它们。

实际上不要将外键约束添加到表中。它们不是必需的。没有他们,你可以随心所欲。只有在必要时才添加它们。

是的,您的第三个解决方案听起来不错。我在许多论坛上看到,当用户被删除时,他的帖子中会显示“用户已删除”。是的,你的第三个解决方案听起来不错。我在许多论坛上看到,当用户被删除时,它会说“用户已删除”在他的帖子中,+1:但是列应该是
ACCOUNT\u STATUS\u code
,在
ACCOUNT\u STATUS\u code
表中有外键。+1:但是列应该是
ACCOUNT\u STATUS\u code
,在
ACCOUNT\u STATUS\u code
表中有外键。当然,但要考虑一下这对OP案例的影响。如果他们这样做了,那么他们查询线程或帖子的每个地方都必须使用用户表上的外部联接,然后检查是否有用户出现。当然,但请考虑一下这对OP案例的影响。如果他们这样做,那么他们查询线程或帖子的每个地方都必须使用用户表上的外部联接,然后检查是否有用户出现。