Ошибка фиктивного ограничения внешнего ключа
я получаю это сообщение об ошибке:
ошибка 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 не позволяет внешние ключи на других схемах, не так ли?
(Я даже могу запустить : -?)
9 ответов:
два варианта:
- есть таблица в другой схеме ("база данных" в терминологии mysql), которая имеет ссылку FK
- внутренний словарь данных innodb не синхронизирован с mysql.
вы можете увидеть, какая таблица это была (одна из них, во всяком случае), выполнив "SHOW ENGINE INNODB STATUS" после сбоя drop.
Если это окажется последним случаем, я бы сбросил и восстановил весь сервер, если вы мочь.
MySQL 5.1 и выше даст вам имя таблицы с FK в сообщении об ошибке.
по требованию, теперь в качестве ответа...
при использовании MySQL Query Browser или phpMyAdmin, кажется, что новое соединение открыто для каждого запроса (bugs.mysql.com/bug.php?id=8280), что делает необходимым написать все операторы drop в одном запросе, например.
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
служит дополнительной мерой безопасности...
С этот блог:
вы можете временно отключить проверку внешнего ключа:
SET FOREIGN_KEY_CHECKS=0;
просто не забудьте восстановить их, как только вы закончите возиться:
SET FOREIGN_KEY_CHECKS=1;
надеюсь, что ее работа
набор foreign_key_checks = 0; ПАДЕНИЕ ТАБЛИЦЕ
table name
; Набор foreign_key_checks = 1;
на рельсах, можно сделать следующее С помощью
rails console
:connection = ActiveRecord::Base.connection connection.execute("SET FOREIGN_KEY_CHECKS=0;")
возможно, вы получили ошибку при работе с этой таблицей раньше. Вы можете переименовать таблицу и попытаться снова удалить.
ALTER TABLE `area` RENAME TO `area2`; DROP TABLE IF EXISTS `area2`;
Я нашел простое решение, экспортировать базу данных, редактировать то, что вы хотите редактировать в текстовом редакторе, а затем импортировать его. Сделано
не удается удалить или обновить родительскую строку: ограничение внешнего ключа не выполняется (
table1
.user_role
ограничениеFK143BF46A8dsfsfds@#5A6BD60
ВНЕШНИЙ КЛЮЧ (user_id
) ссылкиuser
(id
))что я сделал в два простых шага . сначала я удаляю дочернюю строку в дочерней таблице, например
mysql > удалить из таблицы 2, где role_id = 2 & & user_id =20;
запрос ок, 1 ряд пострадавших (0.10 сек)
и второй шаг, как удаление родителя
удалить из table1 где id = 20;
запрос ок, 1 ряд пострадавших (0,12 сек)
этим я решаю проблему, которая означает удалить ребенка, а затем удалить родителя
Я надеюсь, что вы получили его. :)