SQL DELETE из нескольких таблиц - PullRequest
3 голосов
/ 13 декабря 2011

Когда я пытаюсь выполнить этот запрос на удаление, SQL выдает мне следующую ошибку:

"Невозможно удалить или обновить родительскую строку: сбой ограничения внешнего ключа (carpooling. pedido, CONSTRAINT pedido_ibfk_1 FOREIGN KEY (ID_ROTA) ССЫЛКИ rota (ID_ROTA)) "

Запрос:

DELETE rota,rota_alerta,pedido FROM rota
    LEFT OUTER JOIN pedido ON rota.ID_ROTA=pedido.ID_ROTA
    LEFT OUTER JOIN rota_alerta ON rota.ID_ROTA=rota_alerta.ID_ROTA
    WHERE rota.ID_UTILIZADOR=26;

Я пытаюсь удалить все строкииз "pedido" и "rota_alerta", которые связаны со строкой таблицы "rota" с помощью "ID_ROTA".Это «ID_ROTA» зависит от количества строк с одинаковым «ID_UTILIZADOR» (в данном случае 26) в таблице «rota».

Кроме того, я хочу удалить все строки «rota» с указанным «ID_UTILIZADOR».

Как это можно исправить?

РЕДАКТИРОВАТЬ

Я забыл сказать, что я не хочу использовать «каскадные ограничения», потому что есть случаи, когда я должен сделать «удаление поворота, где ID_UTILIZADOR = 26» (как упомянуто в комментарии) и избегатьудалите дочерние строки, если они существуют.

Ответы [ 3 ]

3 голосов
/ 13 декабря 2011

Сначала я удалил бы свои дочерние коллекции:

delete rota_alerta where rota_id in(select id_rota from rota where ID_UTILIZADOR=26)
delete pedido where rota_id in(select rota_id from rota where ID_UTILIZADOR=26)
delete rota where ID_UTILIZADOR=26
1 голос
/ 13 декабря 2011

Измените ограничение внешнего ключа на CASCADE

Ну, из комментария, который вы дали, теперь стало ясно, что каскадное удаление является условным.

Это означает, что вам нужно либо кодироватьиз точных условий.Либо в вашем клиенте, либо в хранимой процедуре.

Или все еще изменить на каскад и снова добавить триггеры, чтобы предотвратить удаление (не уверен, возможно ли это в MySql)

0 голосов
/ 13 декабря 2011

Взгляните на cascade constraints пункт

...