Удаление строк из нескольких таблиц в одной инструкции

#sql #postgresql #sql-delete

Вопрос:

У меня есть 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
 

Любая помощь будет очень признательна

Комментарии:

1. Что плохого в том, чтобы сделать это в двух утверждениях?

Ответ №1:

Стандартный способ сделать это-объявить внешний ключ как ON DELETE CASCADE . При этом, если a user будет удален, все articles , что связано с ним, также будет удалено.

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

ДЕМОНСТРАЦИЯ: db<>fiddle

Если по какой-либо причине вы не можете изменить структуру таблицы, рассмотрите возможность использования a DELETE ... RETURNING users внутри CTE, а затем используйте возвращенные значения во внешнем 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