При создании ссылок по внешним ключам, MySQL может выдать сообщение об ошибке 150:
ERROR 1005: Can't create table './test/emploees.frm' (errno: 150)

Выбор сделан
Выбор можно остановить на таблицах MyISAM, если необходимо улучшить рабочие характеристики и при этом не нужны проверки целостности. А тип InnoDB следует выбирать в случае ограничений по целостности по внешним ключам между таблицами, но при этом придется смириться с ухудшением рабочих характеристик вследствие использования таблиц такого типа. Подробнее об этих таблицах можно узнать в разделах "Таблицы MylSAM" и "Таблицы InnoDB".

Такое сообщение обычно означает, что не все в порядке с объявлением внешнего ключа. Сначала нужно проверить, что таблица и поле, на которые делаются ссылки, действительно существуют, что поля, составляющие внешний ключ, проиндексированы, а синтаксис объявления не содержит ошибок. Можно также получить информацию об ошибках с помощью команды SHOW INNODB STATUS в разделе, связанном с ошибками при работе с внешними ключами.
После того как внешний ключ задан, MySQL позволяет производить ввод в поле em-ployees.fk_department только тех записей, которые существуют в поле departments.id. В продолжение предыдущего примера, посмотрим, как это работает.
Сообщение об ошибке
Таким образом, поскольку отдела с идентификатором 110 в таблице departments не существует, MySQL не принимает запись с этим значением в поле fk_department таблицы employees. Поэтому, ограничения по внешним ключам могут существенно облегчить задачу по поддержанию целостности данных в таблицах базы данных и снижению количества "плохих" или нецелостных значений в полях.
Необходимо постоянно помнить о следующих трех ограничениях при установке связей между таблицами с помощью внешних ключей.
■ Все таблицы, задействованные в связях, должны иметь тип InnoDB. В таблицах другого типа модификатор FOREIGN KEY...REFERENCES MySQL будет просто проигнорирован.
■ Все поля в таблицах, на которые делается ссылка, задействованные в связях, должны быть проиндексированы. Таблицы типа InnoDB автоматически этих индексы не создают. 
■ Типы данных полей, перечисленных во внешнем ключе, должны быть аналогичными. Это особенно справедливо, когда речь идет о целочисленных типах данных, которые должны совпадать как по размеру, так и по знаку.
Можно заметить, что даже если в таблице существует ограничение по внешнему ключу, MySQL позволит удалить эту таблицу без сообщения об ошибке (даже если это разрушит установленные ранее связи по внешнему ключу). Действительно, в версиях MySQL до 4.0.13 удаление таблиц было единственным способом удаления внешних ключей. Это же справедливо и в отношении MySQL начиная с версии 4.0.13. Однако есть и менее жесткие способы удаления внешних ключей из таблицы, а именно - с помощью команды ALTER TABLE. Вот ее синтаксис:
ALTER TABLE имя-таблицы DROP FOREIGN KEY идентификатор-ключа
Значение идентификатор-ключа можно получить с помощью команды SHOW CREATE TABLE (речь о ней пойдет в разделе "Копирование таблиц"). Рассмотрим следующий пример, в котором проиллюстрирован этот процесс.
Сообщение об ошибке
Ломая устои
При пакетной обработке данных, скажем, из файла дампа по подсказке команды mysql или с помощью команды LOAD DATA INFILE, уместно будет отключить проверку внешних ключей, чтобы приложение MySQL не сообщало о нарушениях целостности. Один из способов добиться этого - установить ограничение по внешним ключам командой ALTER TABLE только после того, как таблицы будут созданы и заполнены данными. Другой подход - это отключить проверку ключа, сделав переменную сервера foreign_key_checks равной 0.
Подробнее о команде ALTER TABLE можно узнать в разделе "Модификация таблиц", а о внесении изменений в переменные сервера - в главе 13, "Администрирование и настройка".
В следующем примере показано, как внешний ключ можно удалить с помощью идентификатора 0_18.
Сообщение об ошибке