Ошибка
Впервые встретили данную ошибку при попытке создать новую таблицу InnoBD в Базе Данных средствами Битрикс. Наша таблица называлась "b_sale_order_product_stat". Да, это стандартная таблица модуля "sale", но в нашем случае у клиента ее попросту не было (по непонятным причинам) и стояла задача вернуть ее на место.
При попытке создать таблицу:
$DB->Query("CREATE TABLE IF NOT EXISTS b_sale_order_product_stat(
ID INT NOT NULL AUTO_INCREMENT,
PRODUCT_ID INT NOT NULL,
RELATED_PRODUCT_ID INT NOT NULL,
ORDER_DATE DATETIME NOT NULL,
CNT INT NOT NULL DEFAULT 1,
primary key (ID),
unique IXS_PRODUCT2PRODUCT_ON_DATE (PRODUCT_ID, RELATED_PRODUCT_ID, ORDER_DATE),
index IXS_ORDER_DATE (ORDER_DATE)
)"
);
Выпадала ошибка:
Error Code: 1005. Can't create table "b_sale_order_product_stat" (errno: -1)
И так, разберем код ошибки. Error Code: 1005, как вы догадались, означает что не получается создать таблицу, а вот errno: -1 говорит нам о причине - таблица включает имя столбца, совпадающее с именем внутренней таблицы InnoDB.
Решение
В MySQL создается файл с расширением .frm
, который хранит в себе описание таблицы - его имя идентично имени таблицы. Если включена опция хранить индексы и таблицы в собственном файле (функция "multiple tablespaces"), то InnoDB будет хранить новую таблицу в файле .ibd
в каталоге базы данных рядом с файлами расширением .frm
.
Логично, что если таблицы нет, то и этих файлов тоже не должно там быть. Идем на сервер по пути /var/lib/mysql/<Имя БД>/
и видим там файл b_sale_order_product_stat.ibd
- а ведь его не должно быть там, так как таблицы не существует. Удаляем этот файл. Снова пытаемся создать таблицу и magic - таблица успешно создана, без ошибок!