#mysql
#mysql
Вопрос:
мой запрос
delete ip.*,im.*
from INPUT_MAPPING im
left outer join INPUT_CONFIGURATION ip on(im.INPUT_ID=ip.INPUT_ID)
where ip.INPUT_ID=78
здесь INPUT_CONFIGURATION — это родительская таблица, а INPUT_MAPPING — дочерняя таблица и
INPUT_ID — это первичный ключ для таблицы INPUT_CONFIGURATION и внешний ключ для таблицы INPUT_MAPPING
используя этот запрос, я не могу удалить строку из таблицы INPUT_MAPPING, а также из таблицы INPUT_CONFIGURATION, которая имеет общий INPUT_ как 78
ошибка, возникающая после выполнения
11:19:52 удалить ip., im. из INPUT_MAPPING im слева внешнее соединение INPUT_CONFIGURATION ip на (im.INPUT_ID=ip.INPUT_ID) где ip.INPUT_ID= 78
Код ошибки: 1451. Не удается удалить или обновить родительскую строку: сбой ограничения внешнего ключа (clover_converter.INPUT_MAPPING, ОГРАНИЧЕНИЕ INPUT_MAPPING_ibfk_1 ВНЕШНИЙ КЛЮЧ (INPUT_ID) ССЫЛАЕТСЯ НА INPUT_CONFIGURATION (INPUT_ID)) 0,0033 сек
Комментарии:
1. Почему вы используете левое соединение в своем операторе удаления? Вы действительно хотите удалить запись в своей родительской таблице? Это ошибка, которую вы получаете. Вероятно, у вас есть другая запись в Input_Mapping, которая соответствует удаляемому вами первичному ключу.
2. я хочу удалить запись как из родительской таблицы (INPUT_CONFIGURATION), так и из дочерней таблицы (INPUT_MAPPING). я нашел этот запрос на многих сайтах, и он не работает. есть ли какое-либо другое альтернативное решение для полного удаления записи из обеих таблиц ..? Спасибо
3. Как вы определяете свое ограничение внешнего ключа? Для чего нужны действия
ON DELETE
?
Ответ №1:
Если вам нравятся родительские и дочерние термины, и вы чувствуете, что их легко запомнить, вам может понравиться перевод ON DELETE CASCADE
to Leave No Orphans !
Это означает, что когда родительская строка удаляется (уничтожается), ни одна сиротская строка не должна оставаться живой в дочерней таблице. Все дочерние элементы родительской строки также уничтожаются (удаляются). Если у какого-либо из этих дочерних элементов есть внуки (в другой таблице через другой внешний ключ) и они ON DELETE CASCADE
определены, их тоже следует уничтожить (и всех потомков, если определен каскадный эффект.)
Само ограничение ВНЕШНЕГО КЛЮЧА также может быть описано как разрешить отсутствие сирот! (в первую очередь). Ни один дочерний элемент никогда не должен быть разрешен (записан) в дочерней таблице, если у него нет родительского элемента (строки в родительской таблице).
Для обеспечения согласованности ON DELETE RESTRICT
можно преобразовать в (менее агрессивный) Вы не можете убить родителей! Только бездетные строки могут быть уничтожены (удалены.)
Ответ №2:
Исходя из вашего вопроса, я думаю, можно с уверенностью предположить, что у вас включены КАСКАДНЫЕ УДАЛЕНИЯ. Все, что нужно в этом случае
DELETE FROM MainTable
WHERE PrimaryKey = ???