向MySQL数据库添加外键

向MySQL数据库添加外键,mysql,foreign-keys,Mysql,Foreign Keys,我有一个DigitalOcean LAMP实例来完成我的课堂作业,但是在实验室机器上运行的脚本在我的服务器上尝试添加外键时出错 -------------- create table STATE ( statecode char(2), description varchar(30) NOT NULL, constraint state_statecode_pk primary key (statecode)) -------------- Query OK, 0 rows affecte

我有一个DigitalOcean LAMP实例来完成我的课堂作业,但是在实验室机器上运行的脚本在我的服务器上尝试添加外键时出错

--------------
create table STATE (
statecode   char(2),
description varchar(30) NOT NULL,
constraint state_statecode_pk primary key (statecode))
--------------

Query OK, 0 rows affected (0.02 sec)

--------------
create table EMPLOYER (
companyname     varchar(30) NOT NULL,
division        varchar(30) NOT NULL,
address         varchar(30),
city            varchar(20),
statecode       char(2) not null,
zipcode         int(5),
constraint employer_coname_div_pk PRIMARY KEY (companyname, division),
constraint employer_statecode_fk foreign key (statecode) references state(statecode))

--------------

ERROR 1215 (HY000): Cannot add foreign key constraint
什么样的差异会导致它不在我的机器上工作,而是在实验室机器上工作

我的计算机上的版本:5.6.19 实验室机器上的版本:5.6.21

显示从实验室计算机创建表:

| employer | CREATE TABLE `employer` (
  `companyname` varchar(30) NOT NULL,
  `division` varchar(30) NOT NULL,
  `address` varchar(30) DEFAULT NULL,
  `city` varchar(20) DEFAULT NULL,
  `statecode` char(2) NOT NULL,
  `zipcode` int(5) DEFAULT NULL,
  PRIMARY KEY (`companyname`,`division`),
  KEY `employer_statecode_fk` (`statecode`),
  CONSTRAINT `employer_statecode_fk` FOREIGN KEY (`statecode`) REFERENCES `state` (`statecode`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 |

他们都是InnoDB。服务器为latin1时,lab machine字符集为utf8,但这不会导致创建约束时出错

请检查不同机器上数据库表的引擎。对于外键约束,支持InnoDB。 ENGINE=InnoDB应该显示在show create table tablename中

数据库架构的创建应如下所示:

创建表状态 州代码char2, 说明varchar30不为空,
约束状态\状态码\主键状态码引擎=InnoDB

由于区分大小写取决于机器的文件系统,因此实验室机器窗口的表不区分大小写,而ubuntu服务器上的表区分大小写


因此,在Windows或OS X上引用sales表是可行的,因为sales和sales都引用同一个表,而在Ubuntu上,sales表不存在,并且您不能为不存在的表创建外键。

请发布创建表tablename语句。在实验室机器上,您可能正在创建MyISAM引擎表,而在服务器上,您正在获得InnoDB表-MyISAM实际上并不强制执行FKs,因此,即使不能使用FK,创建也可以工作。我看不出您这里的代码有任何问题-1215的主要原因是父列和子列之间的数据类型不匹配-您的列都是char2-或者父列上缺少索引-您的列是PK,所以这不是问题。值得一提的是,您的create语句使用InnoDB和MyISAM与MySQL 5.6兼容: