2013-05-22 67 views
1

你好,我想創建一個外鍵關聯2個表,但是當我使用此查詢不能在mysql中添加外鍵

ALTER TABLE Player 
ADD CONSTRAINT FK_team_id FOREIGN KEY (team_id) 
REFERENCES Team(id); 

我得到的錯誤錯誤代碼:1215無法添加外鍵約束

我使用的是InnoDB引擎與UTF8編碼..表球員和球隊這個樣子

球員 ID PK AUTO_INCREMENT等 .. .. TEAM_ID(須爲外鍵)

ID PK ..

任何人都得到了這個解決辦法嗎?

下面是創建表的語法

CREATE TABLE `Player` (
    `id` int(11) unsigned NOT NULL AUTO_INCREMENT, 
    `Name` varchar(100) DEFAULT NULL, 
    `Firstname` varchar(100) DEFAULT NULL, 
    `Prefix` varchar(50) DEFAULT NULL, 
    `Age` date DEFAULT NULL, 
    `Position` varchar(2) DEFAULT NULL, 
    `Caps` tinyint(3) DEFAULT NULL, 
    `Goals` tinyint(3) DEFAULT NULL, 
    `Captain` tinyint(1) DEFAULT NULL, 
    `team_id` int(11) DEFAULT NULL, 
    PRIMARY KEY (`id`) 
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8; 

CREATE TABLE `Team` (
    `id` int(11) unsigned NOT NULL AUTO_INCREMENT, 
    `Name` varchar(100) DEFAULT NULL, 
    `Coach` varchar(100) DEFAULT NULL, 
    `Prefix` varchar(50) DEFAULT NULL, 
    PRIMARY KEY (`id`) 
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8; 
+0

是你的表已經填充了數據嗎? – ChristopheBrun

+0

您提到的字段的類型和顯示長度以及Herode說的是什麼 - 您是否使用數據填充它們? –

+0

如果您顯示SHOW CREATE TABLE Player和SHOW CREATE TABLE Team的結果,回答會更容易。 –

回答

2

確保兩列是相同的(SIGNEDNULL能等)。而且,被引用表中的任何值都必須存在。否則,在嘗試創建密鑰以獲取更多信息後運行SHOW INNODB STATUS

+0

它們是相同的。 – Reshad

+0

@Reshad int(11)DEFAULT NULL'與int(11)無符號NOT NULL'不相同 – Kermit

+0

請檢查我的帖子,請添加表格的創建語法 – Reshad

0

無法添加約束有兩個主要原因。

第一個(也是最有可能的)是在Team表中不存在一個或多個team_id的數據。

第二個是如果兩個表的數據類型不同。

運行下面的查詢,以查看是否有與球隊的ID在播放器表有關的問題:

select team_id 
from Player 
where team_id not in (select id from team) 

從本質上講,這將確定缺少team_ids。必要時進行修復。有一點需要注意的是球員表中的球隊表的-1或0(無論你的默認值是什麼),這在球隊表中沒有表現出來。