MySQL:错误代码:1215。无法添加外键约束

时间:2015-02-18 23:43:12

标签: mysql foreign-keys mysql-workbench

我有两张桌子:

Table: utenti
Columns:
userId varchar(255) PK 
password varchar(255)

Table: agenzie
Columns:
agenziaId varchar(255) PK 
userId varchar(255)

当我尝试在agenzie上创建外键时,会显示以下错误消息:

ALTER TABLE agenzie ADD FOREIGN KEY (userId) REFERENCES utenti(userId)  Error Code: 1215. Cannot add foreign key constraint 0.015 sec

我该如何解决?

谢谢。

编辑:

DROP TABLE IF EXISTS `utenti`;
/*!40101 SET @saved_cs_client     = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `utenti` (
`userId` varchar(255) CHARACTER SET latin1 NOT NULL,
`password` varchar(255) CHARACTER SET latin1 NOT NULL,
PRIMARY KEY (`userId`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

DROP TABLE IF EXISTS `agenzie`;
/*!40101 SET @saved_cs_client     = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `agenzie` (
`agenziaId` varchar(255) NOT NULL,
`userId` varchar(255) NOT NULL,
PRIMARY KEY (`agenziaId`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

2 个答案:

答案 0 :(得分:14)

您应该可以运行:

show engine innodb status

并搜索短语latest foreign key error(可能是大写)。

这应该提供有关为什么约束创建失败的更多细节。

当然,鉴于错误消息文本Error Code: 1215. Cannot add foreign key constraint完全无用,您必须想知道为什么开发人员不会立即向您提供该信息,而不是强迫您去寻找它。 / p>


现在你已经做到了,并且看到了:

  

2015-02-19 00:51:55 1528表tesoreria / #sql-12a4_bd的外键约束出错:FOREIGN KEY(userId)REFERENCES utenti(userId):在引用的表中找不到索引其中引用的列显示为表中的第一列,列类型,并且引用的表与不匹配。请注意,使用> = InnoDB-4.1.12创建的表中ENUM和SET的内部存储类型已更改,旧表中的此类列不能被新表中的此类列引用。

这似乎是两件事之一。第一个是没有包含utenti(userId)的索引,如果它是主键,则显然不是这样。

第二个是列不匹配,并且根据您添加的DDL,它似乎可能是罪魁祸首,因为这两列被定义为:

`userId` varchar(255) CHARACTER SET latin1 NOT NULL,
`userId` varchar(255) NOT NULL,

换句话说,可能存在使列成为不同类型的字符集规范。我建议创建完全相同的类型,看看是否能解决问题。

答案 1 :(得分:0)

非常感谢,我已经能够看到您的指示错误,并且看到了来自其他表(direccion)的一个外键,它锁定了表(provincia)的创建,因为外键的列类型与引用表(provincia的列类型不同,后者将创建)。

要创建的表(provincia)之前已被删除,问题已解决sudo mysqladmin -p flush-tables,并且指向它的外键仍然存在,在删除后仍然存在。

我已将外键从direccion删除到provincia,然后才能创建provincia。然后我更改了direccion中的列类型并重新创建了外键。