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

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

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

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

2 ответа

Ты пытался:

UPDATE table1 SET reference=NULL;
DELETE FROM table2 WHERE id=1;
DELETE FROM table1 WHERE id=1;

Очистив ссылку, ограничение FK больше не должно быть проблемой.

У вас есть два варианта. Один из них - очистить ссылку, как указал Горилла в своем посте. Вы делаете это, устанавливая ссылку на ноль или что-то подобное, затем удаляете сообщения в правильном порядке, но это не то, что вы обычно хотите делать.

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

Синтаксис для настройки таблицы для поддержки каскадов выглядит примерно так:

CREATE TABLE car(
        car_id serial PRIMARY KEY,
        owner_id integer NOT NULL REFERENCES owner ON DELETE CASCADE);

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

В зависимости от типа базы данных вы используете команду ALTER TABLE, чтобы ввести каскадное удаление в вашу схему.

Другие вопросы по тегам