我有两张桌子:
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;
答案 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
中的列类型并重新创建了外键。