Удаление ограничений внешнего ключа пользователя из 3 таблиц одним скриптом с использованием postgres

#sql #postgresql #sql-delete

#sql #postgresql #sql-удалить

Вопрос:

У меня есть 3 таблицы: пользователи, Заказы, ставки. Я пытаюсь удалить пользователя по идентификатору, но не могу, потому что у него есть ограничения внешнего ключа (заказы и ставки), которые я должен сначала удалить. Удалить заказ по идентификатору пользователя достаточно просто, но я не могу разобраться с удалением всех заявок заказов с заданным идентификатором пользователя. Существует прямая связь: Users.id = Orders.userId, Order.OrderID = Biddings.OrderID. Я пытаюсь придумать SQL-скрипт, который будет принимать идентификатор пользователя и удалять пользователя со всеми его заказами и ставками. Как этого можно достичь?

Спасибо!

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

1. Проверьте ON DELETE CASCADE внешние ключи.

2. Кстати, вы используете MySQL или Postgresql?

3. @jarlh postgres

4. postgresql.org/docs/current/…

Ответ №1:

вы указали каскадное удаление для каждого ограничения внешнего ключа? если нет, я бы посоветовал вам создать таблицу заказов / ставок с таким ограничением внешнего ключа: FOREIGN KEY (userID) REFERENCES users (userID) ON DELETE CASCADE и FOREIGN KEY (orderID) REFERENCES orders (orderID) ON DELETE CASCADE . После этого вы можете просто delete from users where userID = <ID> . ОБРАТИТЕ внимание, что это был синтаксис для MySQL, для PostgreSQL он может отличаться.

Postgres: userID integer REFERENCES users (userID) ON DELETE CASCADE внутри определения атрибута.

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

1. Таблицы уже построены. Есть идеи, как это сделать в текущей ситуации?

2. вы все равно можете изменить таблицу ALTER TABLE users ADD CONSTRAINT users_fk FOREIGN KEY (userid) REFERENCES users (userID) ON DELETE CASCADE; , но перед этим убедитесь, что вы удалили старый внешний ключ

3. Спасибо, но разве сценарий невозможен? По крайней мере, для удаления всех ставок, сделанных пользователем? (Как я уже сказал, у меня нет идентификатора пользователя в таблице ставок, но он подключен через таблицу заказов.

4. я думаю, что скрипт больше не нужен, поскольку вы должны применить ON DELETE CASCADE also к внешнему ключу, который ссылается на OrderID в таблице ставок. Сценарий будет выглядеть следующим образом после удаления пользователя: все заказы, которые находятся в сочетании с удаленным идентификатором пользователя, будут удалены, и это также будет применяться к ставкам, поскольку ссылочный идентификатор заказа больше не существует.