8

以下查询失败并出现错误“在城市创建外键时出错(检查数据类型)”:

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;
4

7 回答 7

20

数据类型需要匹配:

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在更改数据类型以匹配后,您可能需要对表进行匹配。

于 2012-08-12T22:26:44.957 回答
13

我正在使用 phpMyAdmin,并尝试使用关系视图在不同的表上创建多个索引。但是,我得到了同样的错误,说数据类型不匹配。但是,原因确实是我为多个关系提供了相同的外键名称,并且由于名称重复,mysql 抛出了这个错误。所以重命名你的关系,它应该可以正常工作。

关系视图中的外键添加

于 2016-02-06T05:53:00.630 回答
12

我知道这是一个相当古老的线程,但我也花了一些时间处理这个错误。

我遇到的情况如下:

Table 1: administrations (Primary key: AdministrationId) Table 2: invoices (Foreign key to AdministrationId) Table 3: users (error pops up while creating foreign key)

AdministrationIdmyinvoices和table 中的 colomns都与 table 中的列users类型相同。AdministrationIdadministrations

我这边的错误是我试图创建一个administration_id在我的users表中调用的外键。但在那之前一分钟,我已经在我的invoices表中创建了一个外键,也称为administration_id. 当我试图给外键起另一个名字时,效果很好。

因此,请记住正确命名您的外键(例如,在它们前面加上表名,例如:invoices_administration_idusers_administration_id)。同名的多个外键可能不存在(在同一个数据库中)。

于 2018-07-30T15:07:31.553 回答
5

我知道这个问题已经得到解答,我知道这个问题很老了。但是,我刚刚遇到了同样的错误,但原因不同,并且由于这是此错误的最佳结果,我想我会将这些信息放在这里供我自己将来使用以及之后发生的任何其他人使用我。

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

于 2013-08-05T19:41:00.783 回答
4

值得一提,但两个表之间的排序规则应该相同

我在两个表中都遇到了 varchar(64) 字段的相同问题,我花了一些时间来确定问题来自排序字段,这在两个表字段之间不一样。

于 2015-08-14T11:56:45.420 回答
2

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

于 2017-12-23T07:56:20.763 回答
0

更新数据类型cities.id bigint(20)hotels.city bigint(20) OR 更新数据类型cities.id int(11)hotels.city int(11) AND 更新hotels.cityunsigned因为cities.idunsigned

于 2021-10-29T06:25:26.450 回答