【问题标题】:Delete rows from multiple tables in a single statement在单个语句中从多个表中删除行
【发布时间】:2021-07-28 06:47:48
【问题描述】:

我有 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

任何帮助将不胜感激

【问题讨论】:

  • 在两个语句中这样做有什么问题?

标签: sql postgresql sql-delete


【解决方案1】:

执行此操作的标准方法是将外键声明为ON DELETE CASCADE。这样做,如果一个user被删除,所有与之相关的articles也将被删除。

CREATE TABLE articles (
  user_id int REFERENCES users (id) ON DELETE CASCADE);

演示:db<>fiddle

如果由于某种原因您无法更改表结构,请考虑在 CTE 内使用来自 usersDELETE ... RETURNING,然后在 articles 上的外部 DELETE 中使用返回值:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-01-14
    • 1970-01-01
    • 1970-01-01
    • 2018-11-26
    • 1970-01-01
    • 1970-01-01
    • 2013-07-06
    • 2019-10-16
    相关资源
    最近更新 更多