Ошибка фиктивного ограничения внешнего ключа


я получаю это сообщение об ошибке:

ошибка 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 107

9 ответов:

два варианта:

  1. есть таблица в другой схеме ("база данных" в терминологии mysql), которая имеет ссылку FK
  2. внутренний словарь данных 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=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 сек)

этим я решаю проблему, которая означает удалить ребенка, а затем удалить родителя

Я надеюсь, что вы получили его. :)