#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
Ответ №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 в таблице ставок. Сценарий будет выглядеть следующим образом после удаления пользователя: все заказы, которые находятся в сочетании с удаленным идентификатором пользователя, будут удалены, и это также будет применяться к ставкам, поскольку ссылочный идентификатор заказа больше не существует.