Внешний ключ добавить не в MySQL код ошибки: 1005, количество 150


Поэтому я пытаюсь добавить новый внешний ключ к одной из моих таблиц как таковой:

 ALTER TABLE `UserTransactions`.`ExpenseBackTransactions` 
   ADD CONSTRAINT `FK_EBTx_CustomAccountID`
   FOREIGN KEY (`CustomAccountID` )
   REFERENCES `UserTransactions`.`CustomAccounts` (`CustomAccountID`)
   ON DELETE NO ACTION
   ON UPDATE NO ACTION,
   ADD INDEX `FK_EBTx_CustomAccountID` (`CustomAccountID` ASC) ;

И я продолжаю получать следующую ошибку:

Error Code: 1005
Can't create table './UserTransactions/#sql-187a_29.frm' (errno: 150)

В прошлом я внес довольно много изменений в эту и другие таблицы, и это первый раз, когда я столкнулся с этой проблемой. Есть идеи, что это вызывает?

Обновить

Моя SHOW INNODB STATUS Ошибка:

------------------------
LATEST FOREIGN KEY ERROR
------------------------
110525 15:56:36 Error in foreign key constraint of table UserTransactions/#sql-187a_2c:

  FOREIGN KEY (`CustomAccountID` )
  REFERENCES `UserTransactions`.`CustomAccounts` (`CustomAccountID` )
  ON DELETE NO ACTION
  ON UPDATE NO ACTION
, ADD INDEX `FK_EBTx_CustomAccountID` (`CustomAccountID` ASC):
Cannot resolve table name close to:
 (`CustomAccountID` )
  ON DELETE NO ACTION
  ON UPDATE NO ACTION
, ADD INDEX `FK_EBTx_CustomAccountID` (`CustomAccountID` ASC)
3 14

3 ответа:

Здесь есть хороший контрольный список.

Ниже приведен Бегущий список известных причин, о которых люди сообщили для страшного errno 150:

  1. тип и/или размер двух ключевых полей не совпадают точно. Например, если один из них-INT(10), ключевое поле также должно быть INT(10), а не INT(11) или TINYINT. Вы можете подтвердить размер поля с помощью SHOW CREATE TABLE, потому что браузер запросов иногда визуально показывает только целое число для INT (10) и INT(11). Вы также должны проверить, что один не подписан, а другой не подписан. Они оба должны быть абсолютно одинаковыми. (Подробнее о подписанном и неподписанном здесь).
  2. Одно из ключевых полей, на которое вы пытаетесь ссылаться, не имеет индекса и/или не является первичным ключом. Если одно из полей в связи не является первичным ключом, необходимо создать индекс для этого поля. (спасибо Венкатешу и Эрихеро и окончательно бессвязному за этот совет)
  3. имя внешнего ключа является дубликатом уже существующий ключ. Убедитесь, что имя вашего внешнего ключа уникально в вашей базе данных. Просто добавьте несколько случайных символов в конец вашего имени ключа, чтобы проверить это. (Спасибо Нильсу за этот совет)
  4. одна или обе ваши таблицы являются таблицами MyISAM. Для использования внешних ключей обе таблицы должны быть InnoDB. (На самом деле, если обе таблицы являются MyISAM, то вы не получите сообщение об ошибке – он просто не создаст ключ.) В Обозревателе запросов можно указать тип таблицы.
  5. Ты указали каскад на DELETE SET NULL, но соответствующее ключевое поле установлено в NOT NULL. Это можно исправить, изменив каскад или установив в поле допустимые значения NULL. (Спасибо Сэмми и Джей Джаммин)
  6. убедитесь, что параметры Charset и Collate одинаковы как на уровне таблицы, так и на уровне отдельных полей для ключевых столбцов. (Спасибо FRR за этот совет)
  7. у вас есть значение по умолчанию (т. е. default=0) в столбце внешнего ключа (спасибо Omar за Совет)
  8. Одно из полей в связи является частью комбинированного (составного) ключа и не имеет собственного индивидуального индекса. Даже если поле имеет индекс как часть составного ключа, необходимо создать отдельный индекс только для этого ключевого поля, чтобы использовать его в ограничении. (Спасибо Алексу за этот совет)
  9. у вас есть синтаксическая ошибка в инструкции ALTER или вы неправильно ввели одно из имен полей в отношениях (спасибо Christian & Mateo за Совет)
  10. имя вашего внешнего ключа превышает максимальную длину 64 символов. (Спасибо Nyleta за подсказку)

По моему опыту, errno: 150 обычно указывает на то, что типы данных столбца FOREIGN KEY в таблице ключей и связанной таблице не идентичны. Убедитесь, что CustomAccounts.CustomAccountID и ExpenseBackTransactions.CustomAccountIDимеют один и тот же тип, включая UNSIGNED, Если это применимо.

Если это не поможет, пожалуйста, разместите SHOW CREATE TABLE ExpenseBackTransactions; и SHOW CREATE TABLE CustomAccounts;

Уловка 22. Внешние ключи нуждаются в индексах. MySQL не упорядочивает этот запрос так, чтобы индекс существовал в то время, когда он выполняет проверку внешнего ключа. Таким образом, сначала создайте индекс, а затем добавьте внешний ключ в 2 отдельных запроса.