#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