2012-08-12 163 views
4

下面的查詢失敗,錯誤「錯誤的[表](檢查數據類型)創建外鍵」,「錯誤創建於城市外鍵(檢查數據類型)」:外鍵約束與失敗

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

回答

17

的數據類型必須匹配:

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

1

我知道這已被回答,我知道這個問題是舊的。但是,我剛剛遇到了另一個不同原因的相同錯誤,因爲這是此錯誤的最高結果,所以我想我會將這些信息放在這裏,以供將來我自己使用以及任何其他人一起使用我。

我的列都是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

1

值得一提的,但整理應該是兩個表

我面臨兩個表中的VARCHAR(64)字段相同的問題之間是相同的,我花了一些時間來確定這個問題是從未來排序字段在2個表字段中不相同。

0

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