Нарушение внешнего ключа Bogus не выполняется
Я получаю это сообщение об ошибке:
ОШИБКА 1217 (23000) по строке 40: Не удается удалить или обновить родительскую строку: a ограничение внешнего ключа не работает
... когда я пытаюсь удалить таблицу:
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
: -?)
Ответы
Ответ 1
Две возможности:
- В другой схеме есть таблица ( "база данных" в терминологии mysql), которая имеет ссылку FK
- Внутренний словарь данных innodb не синхронизирован с mysql.
Вы можете увидеть, какая таблица была (одна из них, во всяком случае), выполнив "SHOW ENGN INNODB STATUS" после отказа.
Если это будет последний случай, я бы сбросил и восстановил весь сервер, если вы можете.
MySQL 5.1 и выше дадут вам имя таблицы с FK в сообщении об ошибке.
Ответ 2
По требованию, теперь как ответ...
При использовании MySQL Query Browser или phpMyAdmin кажется, что для каждого запроса открывается новое соединение (bugs.mysql.com/bug.php?id=8280), что делает необходимым написать все данные о снижении операторов в одном запросе, например.
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
служит дополнительной мерой безопасности...
Ответ 3
Отключить проверку внешнего ключа
SET FOREIGN_KEY_CHECKS=0
Ответ 4
из этого блога:
Вы можете временно отключить проверку внешнего ключа:
SET FOREIGN_KEY_CHECKS=0;
Просто не забудьте восстановить их, как только вы сделаете беспорядок:
SET FOREIGN_KEY_CHECKS=1;
Ответ 5
надеюсь, что его работа
SET foreign_key_checks = 0;
DROP TABLE table name
;
SET foreign_key_checks = 1;
Ответ 6
В Rails можно выполнить следующие действия с помощью rails console
:
connection = ActiveRecord::Base.connection
connection.execute("SET FOREIGN_KEY_CHECKS=0;")
Ответ 7
Возможно, вы получили сообщение об ошибке при работе с этой таблицей раньше. Вы можете переименовать таблицу и попытаться удалить ее снова.
ALTER TABLE `area` RENAME TO `area2`;
DROP TABLE IF EXISTS `area2`;
Ответ 8
Я нашел простое решение, экспортировал базу данных, отредактировал ее, что вы хотите редактировать в текстовом редакторе, а затем импортируйте. Готово
Ответ 9
Невозможно удалить или обновить родительскую строку: сбой внешнего ключа (table1
. user_role
, CONSTRAINT [email protected]#5A6BD60
ИНОСТРАННЫЙ КЛЮЧ (user_id
) ССЫЛКИ user
(id
))
Что я сделал двумя простыми шагами. сначала я удаляю дочернюю строку в дочерней таблице, например
mysql > удалить из таблицы2, где role_id = 2 && & user_id = 20;
Запрос ОК, 1 строка затронута (0,10 с)
и второй шаг при удалении родительского
удалить из таблицы 1, где id = 20;
Запрос ОК, 1 строка затронута (0,12 с)
При этом я решаю проблему, которая означает Delete Child, затем Delete parent
Надеюсь, у вас это получилось.:)