Проблема внешнего ключа MySQL - PullRequest
2 голосов
/ 19 ноября 2009

Мой клиент недавно отформатировал свой компьютер и переустановил MySQL Server и мое приложение. Он посетовал, что удаление записей из основной таблицы не влияет на дочерние таблицы. Я попросил его отправить резервную копию базы данных. Когда я восстановил базу данных, я обнаружил, что механизм таблиц изменился на MyISAM, тогда как для них был установлен InnoDB.

Я удалил записи из дочерней таблицы, которые отсутствовали в основной таблице. После этого, когда я не переустанавливаю индекс внешнего ключа, отображается сообщение об ошибке: «Произошло нарушение внешнего ключа. Ошибка 1005», а иногда - 150.

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

В первичной таблице есть два столбца, которые вместе образуют первичный ключ. Столбцы: BillNo, BillDate.

Пожалуйста, помогите.

Ответы [ 2 ]

4 голосов
/ 19 ноября 2009

Это широко известная ошибка MySQL; Я сам несколько раз сталкивался с этой проблемой. Вероятно, у них были проблемы с InnoDB, и они восстановили свою базу данных из резервных копий. Поскольку InnoDB не работал, он обратился к механизму хранения MyISAM, который не поддерживает ограничения целостности (например, внешние ключи).

В основном проблема заключается в том, что, если движок InnoDB не запускается по какой-либо причине (обычно проблемы с конфигурацией) - тогда MySQL молча возвращается к движку MyISAM. Даже если ваше утверждение гласит:

CREATE TABLE () ENGINE=InnoDB

тогда, если InnoDB не активен, MySQL с радостью создаст таблицу MyISAM, даже не предупредив вас. Прощай, целостность данных! :)

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

1 голос
/ 19 ноября 2009
  1. Убедитесь, что вы используете движок InnoDB для обеих таблиц.

  2. Убедитесь, что оба поля имеют одинаковый тип и что они проиндексированы.

С http://dev.mysql.com/doc/refman/5.0/en/innodb-foreign-key-constraints.html:

Если вы воссоздаете таблицу, которая была упал, оно должно иметь определение соответствует внешнему ключу ограничения, ссылающиеся на это. Это должно иметь правильные имена и типы столбцов, и он должен иметь индексы на ссылочные ключи, как указано ранее. Если они не удовлетворены, MySQL возвращает ошибка номер 1005 и относится к ошибке 150 в сообщении об ошибке.

...