Spec-Zone .ru
спецификации, руководства, описания, API

14.2.5.9. Лучшая Обработка ошибок, когда Отбрасывание Индексирует

Для оптимальной производительности с операторами DML InnoDB требует, чтобы индексирование существовало на столбцах внешнего ключа, так, чтобы UPDATE и DELETE операции на родительской таблице могут легко проверить, существуют ли соответствующие строки в дочерней таблице. MySQL создает или отбрасывает такой, индексирует автоматически при необходимости, как побочный эффект CREATE TABLE, CREATE INDEX, и ALTER TABLE операторы.

Когда Вы отбрасываете индексирование, проверки InnoDB, не используется ли индексирование для того, чтобы проверить ограничение внешнего ключа. Нормально все еще отбрасывать индексирование, если есть, другой индексирует, который может использоваться, чтобы осуществить то же самое ограничение. InnoDB препятствует, Вы отбросить последнее индексируете, который может осуществить определенное ограничение по внешнему ключу.

Сообщение, которое сообщает об этом состоянии ошибки:

ERROR 1553 (HY000): Cannot drop index 'fooIdx':needed in a foreign key constraint

Это сообщение является более дружественным чем более раннее сообщение, которое оно заменяет:

ERROR 1025 (HY000): Error on rename of './db2/#sql-18eb_3'to './db2/foo'(errno: 150)

Подобное изменение в сообщении об ошибке применяется к попытке отбросить первичный ключ, индексируют. Для таблиц без явного PRIMARY KEY, InnoDB создает неявный кластерный индекс, используя первые столбцы таблицы, которые объявляются UNIQUE и NOT NULL. Когда Вы отбрасываете такой индексировать, InnoDB автоматически копирует таблицу и восстанавливает индексировать использование различного UNIQUE NOT NULL группа столбцов или сгенерированного системой ключа. Так как эта работа изменяет первичный ключ, она использует медленный метод копирования таблицы и воссоздания индексирования, а не Быстрого метода Создания индекса от Раздела 5.5.6, "Детали реализации Онлайнового DDL".

Ранее, попытка отбросить неявный кластерный индекс (первое UNIQUE NOT NULL индексируйте), отказавший, если таблица не содержала a PRIMARY KEY:

ERROR 42000: This table type requires a primary key