以下查询失败,并显示错误“在城市上创建外键时出错(检查数据类型)”:
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 :(得分:18)
数据类型需要匹配:
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
表。
答案 1 :(得分:3)
值得一提,但两个表之间的整理应该是相同的
我在两个表中都遇到了与varchar(64)字段相同的问题,我花了一些时间来确定问题来自于两个表字段之间不一样的整理字段。
答案 2 :(得分:3)
我知道这是一个很旧的线程,但是我也花了一些时间来解决这个错误。
我遇到的情况如下:
Table 1: administrations (Primary key: AdministrationId)
Table 2: invoices (Foreign key to AdministrationId)
Table 3: users (error pops up while creating foreign key)
我的AdministrationId
和invoices
表中的列users
与AdministrationId
表中administrations
列的类型相同。
我这边的错误是我试图在administration_id
表中创建一个名为users
的外键。但是在此之前的一分钟,我已经在我的invoices
表中创建了一个外键,也称为administration_id
。当我尝试给外键起另一个名字时,效果很好。
因此,请记住正确命名外键(例如,在表名前加上外键,例如:invoices_administration_id
和users_administration_id
)。 多个相同名称的外键可能不存在(在同一数据库中)。
答案 3 :(得分:1)
我知道这已被回答,我知道这个问题已经过时了。但是,我刚刚遇到了同样的错误并且有不同的原因,因为这是此错误的最重要结果,我想我会把这些信息放在这里供将来使用以及之后发生的其他任何人我
我的专栏都是bigint和unsigned。但是,在首次创建引用的表之后,我继续更改主键列的名称。关于它的其他任何事情都没有改变,但我无法建立外键关系。我最终删除了引用的表并使用我想要的列名重新创建它们,并且我能够创建外键关系。
答案 4 :(得分:0)
将hotels.city
更新为unsigned
对我有用。因为cities.id
是unsigned