2009-11-19 2 views
2

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

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

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

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

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

ответ

4

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

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

CREATE TABLE() ENGINE=InnoDB 

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

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

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

  2. Убедитесь, что оба поля одного типа и индексируются.

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

If you re-create a table that was dropped, it must have a definition that conforms to the foreign key constraints referencing it. It must have the right column names and types, and it must have indexes on the referenced keys, as stated earlier. If these are not satisfied, MySQL returns error number 1005 and refers to error 150 in the error message.

Смежные вопросы