如何在子 table 上保留数据 B,而子 table 连接到父 table 上的数据 A,同时删除父 table 上的数据 A?
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?
我正在创建一个论坛类型的网络应用程序,用户可以在其中根据特定主题发表评论。有注册和登录步骤。现在,删除用户帐户时,与用户相关的所有内容也会被删除,例如评论。
有没有办法保留用户发表的评论,但删除用户账号?并将用户名替换为 "deleted"?在创建 comments
table 时,我是否只是从迁移步骤中删除 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
)
谢谢。
一个选项是将外键定义更改为 on delete set null
而不是 on delete cascade
- 这还需要使列 null
可用(目前不可用):
user_id INTEGER REFERENCES users(id) ON DELETE SET NULL
作为 explained in the documentation,此选项会导致 引用行中的引用列被设置为空值 [...],当引用行被删除时.
旁注:一般来说,我实际上不建议从您的引用中删除用户 table。相反,您可以在 table users
中有另一列指示用户已被删除(例如,一个名为 active
的布尔列),并且您可以在查询中用作过滤器.这在某些方面更安全,并且避免了以后使用外键的需要。
我正在创建一个论坛类型的网络应用程序,用户可以在其中根据特定主题发表评论。有注册和登录步骤。现在,删除用户帐户时,与用户相关的所有内容也会被删除,例如评论。
有没有办法保留用户发表的评论,但删除用户账号?并将用户名替换为 "deleted"?在创建 comments
table 时,我是否只是从迁移步骤中删除 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
)
谢谢。
一个选项是将外键定义更改为 on delete set null
而不是 on delete cascade
- 这还需要使列 null
可用(目前不可用):
user_id INTEGER REFERENCES users(id) ON DELETE SET NULL
作为 explained in the documentation,此选项会导致 引用行中的引用列被设置为空值 [...],当引用行被删除时.
旁注:一般来说,我实际上不建议从您的引用中删除用户 table。相反,您可以在 table users
中有另一列指示用户已被删除(例如,一个名为 active
的布尔列),并且您可以在查询中用作过滤器.这在某些方面更安全,并且避免了以后使用外键的需要。