外键约束与失败
下面的查询失败,错误“错误的[表](检查数据类型)创建外键”,“错误创建于城市外键(检查数据类型)”:外键约束与失败
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;
的数据类型必须匹配:
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
。
对。我错误地将hotels.id的数据类型更改为与cities.id匹配,但没有意识到该关系在hotels.city中。感谢您的解决方案! – 2012-08-12 22:31:02
@VictorAugusto我在答案的最后一行中强调了这一点。 – 2015-09-12 08:31:38
没有看到它=)。 – 2015-09-14 12:42:14
我知道这已被回答,我知道这个问题是旧的。但是,我刚刚遇到了另一个不同原因的相同错误,因为这是此错误的最高结果,所以我想我会将这些信息放在这里,以供将来我自己使用以及任何其他人一起使用我。
我的列都是bigint和unsigned。但是,在首次创建引用表之后,我继续更改主键列的名称。没有其他改变,但我无法创建外键关系。我最终删除了引用的表并使用我想要的列名重新创建它们,并且我能够创建外键关系。
为什么不只是重新创建FK关系itlsef? – 2013-08-06 07:09:47
我改变了几个表上主键字段的名字后,完全无法创建FK关系。我唯一的解决方案是放弃表格并重新创建它们。这样做后,我能够创建我想要的FK关系。 – 2013-08-13 12:27:19
我刚刚发现,如果在进行这些更改后对表进行了优化,那么它将允许您在不丢弃表的情况下创建外键关系。 – 2013-10-14 14:10:13
值得一提的,但整理应该是两个表
我面临两个表中的VARCHAR(64)字段相同的问题之间是相同的,我花了一些时间来确定这个问题是从未来排序字段在2个表字段中不相同。
正在更新hotels.city
到unsigned
为我工作。因为cities.id
是unsigned
表中已经有数据吗? – 2012-08-12 22:25:16
酒店是空的,City有一些行已经受到另一个餐桌(餐厅)的限制,这与我尝试上述酒店的方式相同。它第一次工作,但我用手建立了查询,而不使用phpMyAdmin。 – 2012-08-12 22:26:15
一个是'INT',另一个'BIGINT'。 – 2012-08-12 22:26:28