外键约束与失败

问题描述:

下面的查询失败,错误“错误的[表](检查数据类型)创建外键”,“错误创建于城市外键(检查数据类型)”:外键约束与失败

ALTER TABLE `hotels` ADD FOREIGN KEY ( `city`) 
REFERENCES `mydatabase`.`cities` (`id`) 
ON DELETE CASCADE ON UPDATE CASCADE ; 

基本上我想在city.id和hotels.city之间建立一个多对多的关系。

这里有两个表:

CREATE TABLE IF NOT EXISTS `cities` (
    `id` int(11) NOT NULL AUTO_INCREMENT, 
    PRIMARY KEY (`id`) 
) ENGINE=InnoDB; 


CREATE TABLE IF NOT EXISTS `hotels` (
    `id` int(11) NOT NULL AUTO_INCREMENT, 
    `city` bigint(20) DEFAULT NULL, 
    PRIMARY KEY (`id`), 
    KEY `city` (`city`) 
) ENGINE=InnoDB; 
+0

表中已经有数据吗? – 2012-08-12 22:25:16

+0

酒店是空的,City有一些行已经受到另一个餐桌(餐厅)的限制,这与我尝试上述酒店的方式相同。它第一次工作,但我用手建立了查询,而不使用phpMyAdmin。 – 2012-08-12 22:26:15

+0

一个是'INT',另一个'BIGINT'。 – 2012-08-12 22:26:28

的数据类型必须匹配:

cities.id int(11) 
hotels.city bigint(20) 

需要变得之一:

cities.id bigint(20) 
hotels.city bigint(20) 

或者:

cities.id int(11) 
hotels.city int(11) 

取决于您的应用程序需要什么。

另外值得一提的是,两者都需要有符号或无符号。

您可能需要在更改数据类型以匹配您的表之后OPTIMIZE

+0

对。我错误地将hotels.id的数据类型更改为与cities.id匹配,但没有意识到该关系在hotels.city中。感谢您的解决方案! – 2012-08-12 22:31:02

+1

@VictorAugusto我在答案的最后一行中强调了这一点。 – 2015-09-12 08:31:38

+0

没有看到它=)。 – 2015-09-14 12:42:14

我知道这已被回答,我知道这个问题是旧的。但是,我刚刚遇到了另一个不同原因的相同错误,因为这是此错误的最高结果,所以我想我会将这些信息放在这里,以供将来我自己使用以及任何其他人一起使用我。

我的列都是bigint和unsigned。但是,在首次创建引用表之后,我继续更改主键列的名称。没有其他改变,但我无法创建外键关系。我最终删除了引用的表并使用我想要的列名重新创建它们,并且我能够创建外键关系。

+0

为什么不只是重新创建FK关系itlsef? – 2013-08-06 07:09:47

+0

我改变了几个表上主键字段的名字后,完全无法创建FK关系。我唯一的解决方案是放弃表格并重新创建它们。这样做后,我能够创建我想要的FK关系。 – 2013-08-13 12:27:19

+4

我刚刚发现,如果在进行这些更改后对表进行了优化,那么它将允许您在不丢弃表的情况下创建外键关系。 – 2013-10-14 14:10:13

值得一提的,但整理应该是两个表

我面临两个表中的VARCHAR(64)字段相同的问题之间是相同的,我花了一些时间来确定这个问题是从未来排序字段在2个表字段中不相同。

正在更新hotels.cityunsigned为我工作。因为cities.idunsigned