Нарушение внешнего ключа 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

Надеюсь, у вас это получилось.:)