MySQL可以';t创建表(错误号:150)

MySQL可以';t创建表(错误号:150),mysql,indexing,primary-key,Mysql,Indexing,Primary Key,我有以下两个表格: CREATE TABLE `table1` ( `ID` int(11) NOT NULL AUTO_INCREMENT, `CODE` varchar(30) COLLATE utf8_bin NOT NULL, `LANG` varbinary(30) NOT NULL, `NAME` varchar(255) COLLATE utf8_bin NOT NULL, PRIMARY KEY (`ID`), KEY `NewIndex1` (`CODE

我有以下两个表格:

CREATE TABLE `table1` (
  `ID` int(11) NOT NULL AUTO_INCREMENT,
  `CODE` varchar(30) COLLATE utf8_bin NOT NULL,
  `LANG` varbinary(30) NOT NULL,
  `NAME` varchar(255) COLLATE utf8_bin NOT NULL,
  PRIMARY KEY (`ID`),
  KEY `NewIndex1` (`CODE`)
) ENGINE=InnoDB AUTO_INCREMENT=10 DEFAULT CHARSET=utf8 COLLATE=utf8_bin

我试图引用以下内容:

alter table `factorydb`.`table2` add constraint `FK_table2` FOREIGN KEY (`TABLE1_CODE`) REFERENCES `table1` (`CODE`)
我得到一个错误:

Can't create table 'factorydb.#sql-70c_306' (errno: 150)
这样做的目的是处理表中的语言条目,以便在表1中有一些值

ID | CODE   | LANG | NAME
1   CARCODE    EN    Car
2   CARCODE    DE    Auto
我想引用表1中的代码对于我来说,两个CARCODE值都是有效的,仅取决于语言设置

我做错了


感谢所有帮助。

外键中的两列必须具有相同的类型、长度和排序规则


顺便说一句,您确实希望在整数上设置外键,而不是在varchar上设置外键,这样连接速度更快,占用的空间更少。问题是两个链接列的类型不同:

Table1
---------  
`CODE` varchar(30) COLLATE utf8_bin NOT NULL,

Table2
---------
`SOME_ADD` varchar(30) DEFAULT NULL, 
//This column does not have the utf8_bin collation !

您需要确保定义完全相同。

更改FK列,如

TABLE1_CODE varchar(30) COLLATE utf8_bin NOT NULL 
TABLE1_CODE varchar(30) COLLATE utf8_bin NOT NULL