Как удалить запись, когда две таблицы имеют внешний ключ, ссылающийся друг на друга?

Удаление любой записи о них сообщит об ошибке, подобной этой:

ОШИБКА 1451 (23000): не удается удалить или обновить родительскую строку: ограничение внешнего ключа не работает

Как преодолеть эту проблему?


person user198729    schedule 27.02.2010    source источник
comment
Я думаю, что вы неправильно спроектировали БД, если две таблицы ссылаются друг на друга?   -  person Steven    schedule 27.02.2010


Ответы (5)


Выберите запись, которая позволяет вставлять nulls в столбец FK, вставьте ее туда, удалите другую запись, а затем удалите первую.

person Anton Gogolev    schedule 27.02.2010

либо

ON DELETE CASCADE

или вставьте NULL для одного из FK, если это возможно в вашей схеме, не можете предоставить дополнительную информацию, не зная поставщика.

person Paul Creasey    schedule 27.02.2010

если ваш столбец AllowNull, обновите его данные до нуля, а затем удалите данные.

person masoud ramezani    schedule 27.02.2010

Если обе таблицы ссылаются друг на друга по внешнему ключу, весьма вероятно, что дизайн базы данных нуждается в улучшении. Я думаю, это должно вызвать дополнительную таблицу, чтобы позаботиться об этом дизайне.

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

Но чтобы это произошло, убедитесь, что вы заранее идентифицировали оба PK, чтобы их можно было удалить.

person Kalpak    schedule 27.02.2010
comment
Структура базы данных может быть такой, как ожидалось: например, вы можете применить правило, согласно которому у родителя должен быть хотя бы один дочерний элемент, или пометить дочернюю строку по умолчанию в родительской строке. - person gbn; 28.02.2010

person    schedule
comment
Возможно, стоит добавить пояснение. - person Huey; 22.07.2015
comment
Это зависит от сервера sql.. для mysql это работает: - person Mohammad Zekrallah; 23.02.2019