Поддельное ограничение внешнего ключа не выполнено - PullRequest
110 голосов
/ 26 июля 2010

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

ОШИБКА 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: -?)

Ответы [ 9 ]

121 голосов
/ 08 ноября 2013

По требованию, теперь как ответ ...

При использовании 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 служит дополнительной мерой безопасности ...

101 голосов
/ 26 июля 2010

Две возможности:

  1. В другой схеме есть таблица («база данных» в терминологии mysql), которая имеет ссылку на FK
  2. Внутренний словарь данных innodb не синхронизированс mysql one.

Вы можете увидеть, какой это была таблица (в любом случае, одна из них), выполнив «SHOW ENGINE INNODB STATUS» после сбоя отбрасывания.

Если онооказывается, что в последнем случае я дам дамп и восстановлю весь сервер, если вы сможете.

MySQL 5.1 и выше даст вам имя таблицы с FK в сообщении об ошибке.

47 голосов
/ 26 июля 2010

Отключить проверку внешнего ключа

SET FOREIGN_KEY_CHECKS=0
28 голосов
/ 19 апреля 2014

из этого блога :

Вы можете временно отключить проверку внешнего ключа:

SET FOREIGN_KEY_CHECKS=0;

Обязательно восстановите их, как только закончите возиться:

SET FOREIGN_KEY_CHECKS=1;
6 голосов
/ 26 февраля 2015

, надеюсь, его работа

SET foreign_key_checks = 0;DROP TABLE table name;SET foreign_key_checks = 1;

1 голос
/ 07 сентября 2015

На Rails можно сделать следующее, используя rails console:

connection = ActiveRecord::Base.connection
connection.execute("SET FOREIGN_KEY_CHECKS=0;")
0 голосов
/ 09 июня 2016

Я нашел простое решение: экспортируйте базу данных, отредактируйте ее в текстовом редакторе, а затем импортируйте.Готово

0 голосов
/ 18 января 2016

Невозможно удалить или обновить родительскую строку: сбой ограничения внешнего ключа (table1. user_role, CONSTRAINT FK143BF46A8dsfsfds@#5A6BD60 FOREIGN KEY (user_id) ССЫЛКИ user (id))

Что я сделал в два простых шага. сначала я удаляю дочернюю строку в дочерней таблице, например

mysql> удалить из таблицы2, где role_id = 2 && user_id = 20;

Запрос в порядке, затрагивается 1 строка (0,10 с)

и второй шаг как удаление родителя

удалить из таблицы1, где id = 20;

Запрос в порядке, 1 строка затронута (0,12 с)

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

Надеюсь, ты понял. :)

0 голосов
/ 08 сентября 2013

Возможно, вы получили ошибку при работе с этой таблицей раньше.Вы можете переименовать таблицу и попытаться удалить ее снова.

ALTER TABLE `area` RENAME TO `area2`;
DROP TABLE IF EXISTS `area2`;
...