如何解决在单个语句中从多个表中删除行
我有 2 个表,分别是 users
和 articles
,我还需要从文章中删除一个用户和该用户的所有实例,但我需要在单个语句中完成。所以我不能说:
DELETE FROM users WHERE id = 1
DELETE FROM articles WHERE user_id = 1
有什么办法可以说:
SELECT u.name,u.id,a.user_id
FROM users u,articles a
WHERE u.id = a.user_id
DELETE FROM thistable
WHERE id = 1
任何帮助将不胜感激
解决方法
执行此操作的标准方法是将外键声明为 ON DELETE CASCADE
。这样做,如果一个 user
被删除,所有与它相关的 articles
也将被删除。
CREATE TABLE articles (
user_id int REFERENCES users (id) ON DELETE CASCADE);
演示:db<>fiddle
如果由于某种原因您无法更改表结构,请考虑在 CTE 内部使用 DELETE ... RETURNING
中的 users
,然后在外部 DELETE
上使用返回值articles
:
WITH j (id) AS (
DELETE FROM users WHERE id = 1
RETURNING id
)
DELETE FROM articles a USING j
WHERE a.user_id = j.id;
演示:db<>fiddle
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。