微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

在单个语句中从多个表中删除行

如何解决在单个语句中从多个表中删除行

我有 2 个表,分别是 usersarticles,我还需要从文章删除一个用户和该用户的所有实例,但我需要在单个语句中完成。所以我不能说:

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 举报,一经查实,本站将立刻删除。