ТОП-10 популярных


НОУТБУК с блестящим экраном
Eсли выпустившая ноутбук фирма предлагает его в качестве «замены настольному ПК», то это должно подразумевать под собой нечто большее, чем...


Для работы с вещественными числами в MySQL предусмотрено три типа данных - это типы FLOAT, DOUBLE, DECIMAL. Числовой тип FLOAT...

Магнито-оптический дисковод DynaMO
Cейчас, когда традиционные флоппи-дисководы на долгие годы замерли в своем развитии, поиск альтернативных носителей продолжается, и ситуация, казалось бы, разрешилась...

БОЛЬШЕ БОЛЬШИХ LCD-мониторов
Процесс вытеснения с рынка мониторов с электронно-лучевой трубкой (CRT) продолжается. О смещении акцентов в пользу LCD-мониторов теперь заявляют даже те...

Больше больших LCD-мониторов
Процесс вытеснения с рынка мониторов с электронно-лучевой трубкой (CRT) продолжается. О смещении акцентов в пользу LCD-мониторов теперь заявляют даже те...


Какую только информацию мы не помещаем на компакт-диски: резервные копии важных данных, музыку, фильмы... Многие полагают, что главное - «купить...

Иди и пиши. TravelMate C100
Планшетный компьютер платформы Tablet PC обязан в первую очередь быть легким, способным достаточно долго работать без подзарядки батарей. Эти требования...

Размер объему не помеха.
С тех пор как компания Fujitsu отказалась от производства жестких дисков для настольных компьютеров, многие пользователи начали забывать о том,...

ПОД ЛИТЕРОЙ «N»
Aтаку LCD-мониторов не остановить, а масштабы этого наступления даже немного пугают. Судите сами — многие пользователи только начинают приглядываться к новому для...

Internet2, или cтарые песни о новом
Когда-то на заре Интернета, тогдаеще военно-научной сетиAPRAnet, были заложены основныепринципы функционирования«Сети сетей». В их числе — использованиепротокола, называемого сейчасIPv4. В...

Все о MySQL. Сообщение об ошибке


28-12-2009

При создании ссылок по внешним ключам, 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.
Сообщение об ошибке

Понравился материал? Поделитесь с друзьями!



<< Предыдущая статьяСледующая статья >>
Все о MySQL. Первичные ключи Все о MySQL. Сообщение об ошибке. Продолжение.