При создании ссылок по внешним ключам, 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.
ТОП-10 популярных
Для работы с вещественными числами в MySQL предусмотрено три типа данных - это типы FLOAT, DOUBLE, DECIMAL. Числовой тип FLOAT...
БОЛЬШЕ БОЛЬШИХ LCD-мониторов
Процесс вытеснения с рынка мониторов с электронно-лучевой трубкой (CRT) продолжается. О смещении акцентов в пользу LCD-мониторов теперь заявляют даже те...
Процесс вытеснения с рынка мониторов с электронно-лучевой трубкой (CRT) продолжается. О смещении акцентов в пользу LCD-мониторов теперь заявляют даже те...
Больше больших LCD-мониторов
Процесс вытеснения с рынка мониторов с электронно-лучевой трубкой (CRT) продолжается. О смещении акцентов в пользу LCD-мониторов теперь заявляют даже те...
Процесс вытеснения с рынка мониторов с электронно-лучевой трубкой (CRT) продолжается. О смещении акцентов в пользу LCD-мониторов теперь заявляют даже те...
НОУТБУК с блестящим экраном
Eсли выпустившая ноутбук фирма предлагает его в качестве «замены настольному ПК», то это должно подразумевать под собой нечто большее, чем...
Eсли выпустившая ноутбук фирма предлагает его в качестве «замены настольному ПК», то это должно подразумевать под собой нечто большее, чем...
Иди и пиши. TravelMate C100
Планшетный компьютер платформы Tablet PC обязан в первую очередь быть легким, способным достаточно долго работать без подзарядки батарей. Эти требования...
Планшетный компьютер платформы Tablet PC обязан в первую очередь быть легким, способным достаточно долго работать без подзарядки батарей. Эти требования...
Магнито-оптический дисковод DynaMO
Cейчас, когда традиционные флоппи-дисководы на долгие годы замерли в своем развитии, поиск альтернативных носителей продолжается, и ситуация, казалось бы, разрешилась...
Cейчас, когда традиционные флоппи-дисководы на долгие годы замерли в своем развитии, поиск альтернативных носителей продолжается, и ситуация, казалось бы, разрешилась...
Компьютер для гурманов.«Эксимер ДМ»
Российская компания «Эксимер ДМ», известная как производитель настольных компьютеров, рабочих станций, серверов и ноутбуков, выступила техническим спонсором проведения торжеств, посвященных...
Российская компания «Эксимер ДМ», известная как производитель настольных компьютеров, рабочих станций, серверов и ноутбуков, выступила техническим спонсором проведения торжеств, посвященных...
Для длинных строк, т.е. строк длиннее 255 символов, в MySQL предусмотрены типы BLOB (Binary Large Object, большой двоичный объект) и...
В дополнение к календарным типам, предназначенным для хранения даты и времени отдельно, MySQL также поддерживает гибридные типы данных DATETIME и...
Вообще, к изменению настроек сервера прибегают очень редко. В MySQL программа заранее настроена так, чтобы соответствовать самым распространенным и основным...
Все о MySQL. Сообщение об ошибке
28-12-2009
<< Предыдущая статья | Следующая статья >> |
Все о MySQL. Первичные ключи | Все о MySQL. Сообщение об ошибке. Продолжение. |