Я получаю это сообщение об ошибке:
ОШИБКА 1217 (23000) в строке 40: невозможно удалить или обновить родительскую строку: ограничение внешнего ключа не выполнено.
... когда я пытаюсь сбросить стол:
DROP TABLE IF EXISTS `area`;
... определяется так:
CREATE TABLE `area` (
`area_id` char(3) COLLATE utf8_spanish_ci NOT NULL,
`nombre_area` varchar(30) COLLATE utf8_spanish_ci NOT NULL,
`descripcion_area` varchar(100) COLLATE utf8_spanish_ci NOT NULL,
PRIMARY KEY (`area_id`),
UNIQUE KEY `nombre_area_UNIQUE` (`nombre_area`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_spanish_ci;
Забавно то, что я уже отбросил все другие таблицы в схеме, против которых есть внешние ключи area
. Собственно база пуста, кроме area
таблицы.
Как у него могут быть дочерние строки, если в базе данных нет другого объекта? Насколько я знаю, InnoDB не позволяет использовать внешние ключи для других схем, не так ли?
(Я даже могу запустить RENAME TABLE area TO something_else
команду: -?)
CONSTRAINT fk_servicio_area1 FOREIGN KEY (area_id) REFERENCES area (area_id)
, т. Е. Без имени схемы в ссылке на таблицу: -?Ответы:
Две возможности:
Вы можете увидеть, какая это была таблица (во всяком случае, одна из них), выполнив «SHOW ENGINE INNODB STATUS» после сбоя сброса.
Если окажется, что это последний случай, я бы сбросил и восстановил весь сервер, если сможете.
MySQL 5.1 и выше выдаст вам имя таблицы с FK в сообщении об ошибке.
источник
SHOW ENGINE INNODB STATUS
сообщает.По запросу, теперь как ответ ...
При использовании MySQL Query Browser или phpMyAdmin создается впечатление, что для каждого запроса открывается новое соединение ( bugs.mysql.com/bug.php?id=8280 ), поэтому необходимо записывать все операторы drop в одном запросе, например.
Где
SET FOREIGN_KEY_CHECKS=1
служит дополнительной мерой безопасности ...источник
SET FOREIGN_KEY_CHECKS=0;
в начало дампа.Отключить проверку внешнего ключа
источник
SET FOREIGN_KEY_CHECKS=0
это правильная команда, и она исправляет сообщение об ошибке. Вы хоть представляете, зачем это нужно? Кэшируются ли внешние ключи даже после удаления таблиц?SET FOREIGN_KEY_CHECKS=1;
после того, как закончите!SET FOREIGN_KEY_CHECKS=0; DROP TABLE my_first_table_to_drop; DROP TABLE my_second_table_to_drop; SET FOREIGN_KEY_CHECKS=1;
Где SET FOREIGN_KEY_CHECKS = 1 служит дополнительной мерой безопасности ...из этого блога :
Вы можете временно отключить проверку внешнего ключа:
Просто не забудьте восстановить их, когда закончите возиться:
источник
надеюсь его работа
УСТАНОВИТЬ foreign_key_checks = 0; ТАБЛИЦА ПАДЕНИЯ
table name
; УСТАНОВИТЬ foreign_key_checks = 1;источник
В Rails можно делать следующее, используя
rails console
:источник
Возможно, вы раньше получали ошибку при работе с этой таблицей. Вы можете переименовать таблицу и попробовать удалить ее снова.
источник
Я нашел простое решение: экспортируйте базу данных, отредактируйте то, что вы хотите отредактировать, в текстовом редакторе, а затем импортируйте. Готово
источник
CREATE TABLE
кода и повторная загрузка дампа ... не заставит MySQL удалить таблицу. И если вы имеете в виду восстановление дампа в новой базе данных ... Если вы хотите стереть все таблицы, как я, вновь созданная база данных будет уже пустой. Если вы хотите сохранить несколько таблиц,SET FOREIGN_KEY_CHECKS=0
обходной путь, упомянутый здесь повсюду, работает нормально и проще; и вам, вероятно, в любом случае не нужно редактировать дамп, поскольку новая копия ваших данных, возможно, не будет иметь несинхронизированного словаря данных.Невозможно удалить или обновить родительскую строку: ограничение внешнего ключа не выполняется (
table1
.user_role
, CONSTRAINTFK143BF46A8dsfsfds@#5A6BD60
FOREIGN KEY (user_id
) REFERENCESuser
(id
))Что я сделал в два простых шага. сначала я удаляю дочернюю строку в дочерней таблице, например
mysql> удалить из таблицы2, где role_id = 2 && user_id = 20;
Запрос в порядке, затронута 1 строка (0,10 сек)
и второй шаг как удаление родителя
удалить из таблицы1, где id = 20;
Запрос в порядке, затронута 1 строка (0,12 сек)
Этим я решаю проблему, что означает Удалить ребенка, затем удалить родителя
Надеюсь, ты понял. :)
источник