Ошибка MySQL 150 при запуске скрипта создания таблицы

Я создаю сценарии создания для своей базы данных и получаю сообщение об ошибке, которое не могу понять. Я проследил это до ссылки на внешний ключ, но поиск в Google errno(150) не особенно помог.

Скрипт, который не работает:

create table ITEM_TBL(
IT_ITEM_ID_FLD INT AUTO_INCREMENT,
IT_ITEM_NAME_FLD VARCHAR(50),
ITY_ITEM_TYPE_FLD INT,
UT_USER_ID_FLD INT,
IT_CHECKOUT_STATUS_FLD VARCHAR(1),
IT_LAST_UPDATE_FLD DATE,
IT_LAST_ITEM_CHANGE_FLD DATE,
IT_ACTIVE_FLD VARCHAR(1),
PRIMARY KEY (IT_ITEM_ID_FLD),
FOREIGN KEY (UT_USER_ID_FLD)
REFERENCES USER_TBL(UT_USER_ID_FLD),
FOREIGN KEY (ITY_ITEM_TYPE_FLD)
REFERENCES ITEM_TYPE_TBL(ITY_ITEM_TYPE_FLD)
) ENGINE = INNODB;

(ПРИМЕЧАНИЕ: это последний внешний ключ, который вызывает ошибку, потому что когда он удален, он работает отлично)

Таблицы, на которые ссылаются внешние ключи:

create table ITEM_TYPE_TBL(
ITY_ITEM_TYPE_ID_FLD INT AUTO_INCREMENT,
ITY_ITEM_TYPE_NAME_FLD VARCHAR(50),
PRIMARY KEY (ITY_ITEM_TYPE_ID_FLD)
) ENGINE = INNODB;

create table USER_TBL(
UT_USER_ID_FLD INT AUTO_INCREMENT,
UT_NAME_FLD VARCHAR(50),
UT_EMAIL_ADDRESS_FLD VARCHAR(50),
UT_CARD_NUMBER INT NOT NULL,
PRIMARY KEY (UT_USER_ID_FLD)
) ENGINE = INNODB;

Конкретная ошибка, которую я получаю:

#1005 - Невозможно создать таблицу 'db.ITEM_TBL' (номер ошибки: 150)


person Marshall Tigerus    schedule 15.01.2014    source источник
comment
Похоже, что ITY_ITEM_TYPE_FLD не существует в ITEM_TYPE_TBL. Вы хотели использовать ITY_ITEM_TYPE_ID_FLD?   -  person Michael Berkowski    schedule 16.01.2014
comment
Это проблема, спасибо. Я, наверное, пропустил это десять раз.   -  person Marshall Tigerus    schedule 16.01.2014
comment
Я скажу, что эти имена таблиц и столбцов вызывают слепоту кода. ITY_ITEM_ITY_TYPE_ITEM_FLD_ID :)   -  person Michael Berkowski    schedule 16.01.2014
comment
их цель на самом деле состоит в том, чтобы их было легче запомнить и следовать стандарту кода. Поскольку каждый первичный ключ заканчивается на ID_FLD, я должен был понять проблему раньше, но я согласен, что похожие имена затрудняют обнаружение проблем.   -  person Marshall Tigerus    schedule 16.01.2014


Ответы (1)


Перед созданием отношения внешнего ключа убедитесь, что ваши таблицы (с индексами) уже существуют. Как это

create table USER_TBL(
  UT_USER_ID_FLD INT AUTO_INCREMENT,
  UT_NAME_FLD VARCHAR(50),
  UT_EMAIL_ADDRESS_FLD VARCHAR(50),
  UT_CARD_NUMBER INT NOT NULL,
  PRIMARY KEY (UT_USER_ID_FLD)
  )ENGINE = INNODB;

create table ITEM_TYPE_TBL( 
  ITY_ITEM_TYPE_ID_FLD INT AUTO_INCREMENT,
  ITY_ITEM_TYPE_NAME_FLD VARCHAR(50),
  PRIMARY KEY (ITY_ITEM_TYPE_ID_FLD)
  ) ENGINE = INNODB; 

create table ITEM_TBL(
  IT_ITEM_ID_FLD INT AUTO_INCREMENT,
  IT_ITEM_NAME_FLD VARCHAR(50),
  ITY_ITEM_TYPE_FLD INT,
  UT_USER_ID_FLD INT,
  IT_CHECKOUT_STATUS_FLD CHAR(1),
  IT_LAST_UPDATE_FLD datetime,  
  IT_LAST_ITEM_CHANGE_FLD DATE,
  IT_ACTIVE_FLD CHAR(1),
  primary key (IT_ITEM_ID_FLD),
  FOREIGN KEY (UT_USER_ID_FLD) 
  REFERENCES USER_TBL(UT_USER_ID_FLD) ,
  FOREIGN KEY (ITY_ITEM_TYPE_FLD) 
  REFERENCES ITEM_TYPE_TBL(ITY_ITEM_TYPE_ID_FLD) 
  ) ENGINE = INNODB;

Кстати, у вас также была опечатка (ITY_ITEM_TYPE_ID_FLD vs ITY_ITEM_TYPE_FLD)

Это работает в sqlfiddle

person Jeff    schedule 15.01.2014
comment
Да, с моей таблицей зависимости в порядке. - person Marshall Tigerus; 16.01.2014