【问题标题】:How do I keep data B on a child table that is connected to data A on the parent table, while deleting data A on the parent table?如何在连接到父表上数据 A 的子表上保留数据 B,同时删除父表上的数据 A?
【发布时间】:2020-05-27 01:11:08
【问题描述】:

我正在创建一个论坛类型的网络应用程序,用户可以在其中根据特定主题离开 cmets。有注册和登录步骤。现在,当一个用户帐户被删除时,与该用户相关的所有内容也会被删除,例如 cmets。

有没有办法保留用户生成的 cmets,但删除用户帐户?并将用户名替换为“已删除”?创建comments 表时,我是否只需从迁移步骤中删除ON DELETE CASCADE

CREATE TABLE users (
  id INTEGER PRIMARY KEY GENERATED BY DEFAULT AS IDENTITY,
  username TEXT NOT NULL UNIQUE,
  nickname TEXT NOT NULL UNIQUE,
  password TEXT NOT NULL,
  date_created TIMESTAMPTZ DEFAULT now() NOT NULL
);
CREATE TABLE comments (
  id INTEGER PRIMARY KEY GENERATED BY DEFAULT AS IDENTITY,
  comment TEXT NOT NULL,
  date_created TIMESTAMPTZ DEFAULT now() NOT NULL,
  date_modified TIMESTAMPTZ DEFAULT now() NOT NULL,
  vinmake_id INTEGER
    REFERENCES vinmake(id) ON DELETE CASCADE,
  dtc_id INTEGER
    REFERENCES dtc(id) ON DELETE CASCADE NOT NULL,
  user_id INTEGER
    REFERENCES users(id) ON DELETE CASCADE NOT NULL
)

谢谢。

【问题讨论】:

    标签: sql node.js postgresql foreign-keys sql-delete


    【解决方案1】:

    一种选择是将外键定义更改为on delete set null 而不是on delete cascade - 这还需要使列nullable(目前不可用):

    user_id INTEGER REFERENCES users(id) ON DELETE SET NULL
    

    作为explained in the documentation,当被引用的行被删除时,此选项会导致引用行中的引用列被设置为空值[...]。

    旁注:一般来说,我实际上并不建议从您的参考表中删除用户。相反,您可以在表users 中有另一列指示用户已被删除(例如,一个名为active 的布尔列),并且您可以在查询中用作过滤器。这在某些方面更安全,并且避免了以后使用外键的需要。

    【讨论】:

      猜你喜欢
      • 2015-01-30
      • 1970-01-01
      • 2013-11-10
      • 1970-01-01
      • 2021-06-05
      • 2019-07-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多