sql - 如何在连接到父表上数据 A 的子表上保留数据 B,同时删除父表上的数据 A?
问题描述
我正在创建一个论坛类型的网络应用程序,用户可以在其中根据特定主题发表评论。有注册和登录步骤。现在,当一个用户帐户被删除时,与该用户相关的所有内容也会被删除,例如评论。
有没有办法保留用户生成的评论,但删除用户帐户?并将用户名替换为“已删除”?ON DELETE CASCADE
创建表时我是否只是从迁移步骤中删除comments
?
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
如文档中所述,当删除引用的行时,此选项会导致引用行中的引用列设置为空值 [...]。
旁注:一般来说,我实际上并不建议从您的参考表中删除用户。相反,您可以在表中有另一列users
指示用户已被删除(例如,一个名为 的布尔列active
),并且您可以在查询中将其用作过滤器。这在某些方面更安全,并且避免了以后使用外键的需要。
推荐阅读
- javascript - Javascript 的“new Date()”为“2011-02-1”和“2011-02-01”返回不同的日期
- node.js - NodeJS (Express) - app.delete 路由不工作
- python - 我的代码中出现的代码第 14 部分第 2 部分的错误是什么?
- react-native-firebase - 为什么我会收到 [RNFirebaseMessaging 实例] 的错误?
- python - 为什么我不能使用 SVM 和 KNN 预测新数据?
- python - 从导入模块中的函数更改字符串变量
- vue.js - 为什么 Webpack 统计中的 `moduleName` 包含 '+ 4 个模块'?
- apache - C:/Apache24/conf/httpd.conf: Include 接受一个参数,要包含的配置文件的名称
- laravel - API 验证 laravel 5.7
- protractor - 在量角器中同时运行浏览器命令