MySQL中的外键添加失败,错误代码为1005,编号为150

tha*_*awg 14 mysql foreign-keys mysql-error-1005

所以我试图在我的一个表中添加一个新的外键:

 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) ;
Run Code Online (Sandbox Code Playgroud)

我一直收到以下错误:

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

我过去对这个表和其他表做了很多改动,这是我第一次遇到这个问题.是什么导致它的想法?

UPDATE

我的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)
Run Code Online (Sandbox Code Playgroud)

Kon*_*rak 27

这里有一个很好的清单.

以下是人们为可怕的errno 150报告的已知原因的运行列表:

  1. 两个关键字段类型和/或大小不完全匹配.例如,如果一个是INT(10),则关键字段也需要是INT(10)而不是INT(11)或TINYINT.您可能希望使用SHOW CREATE TABLE确认字段大小,因为查询浏览器有时会直观地显示INT(1)和INT(11)的INTEGER.您还应检查一个是否已签名而另一个是否为UNSIGNED.它们都需要完全相同.(关于签名vs未签名的更多信息).
  2. 您尝试引用的关键字段之一没有索引和/或不是主键.如果关系中的某个字段不是主键,则必须为该字段创建索引.(感谢Venkatesh和Erichero以及Terminally Incoherent的提示)
  3. 外键名称是已存在键的副本.检查外键的名称在数据库中是否唯一.只需在密钥名称的末尾添加一些随机字符即可对其进行测试.(感谢Niels的提示)
  4. 您的一个或两个表是MyISAM表.为了使用外键,表必须都是InnoDB.(实际上,如果两个表都是MyISAM,那么您将不会收到错误消息 - 它只是不会创建密钥.)在查询浏览器中,您可以指定表类型.
  5. 您已指定级联ON DELETE SET NULL,但相关键字段设置为NOT NULL.您可以通过更改级联或将字段设置为允许NULL值来解决此问题.(感谢Sammy和J Jammin)
  6. 确保Charset和Collat​​e选项在表级别以及关键列的单个字段级别都相同.(感谢FRR提供的这个提示)
  7. 您的外键列上有一个默认值(即默认值= 0)(感谢Omar的提示)
  8. 关系中的一个字段是组合(复合)键的一部分,并且没有它自己的单独索引.即使该字段具有索引作为复合键的一部分,您也必须仅为该键字段创建单独的索引,以便在约束中使用它.(感谢Alex提供的这个提示)
  9. 您在ALTER语句中有语法错误,或者您在关系中输错了其中一个字段名称(感谢Christian&Mateo的提示)
  10. 外键的名称超过64个字符的最大长度.(感谢Nyleta提示)

  • 事实证明,它是一个意外创建为MyISAM而不是InnoDB的表.一种非常有趣的ID-10-T错误暴露方式. (2认同)