2017-03-16 45 views
1

嘗試在兩個表中的兩個字段之間創建一個簡單的關係 - 包含字段'USER_TOKEN'的'任務'表和字段'TOKEN'的'USER'表。這兩個字段是相同的結構。正如您可以看到錯誤和其他可能幫助您理解問題並解決問題的事情。無法在MySQL數據庫中添加外鍵

系統:MacOS 10.12.3 | DB:MySQL 5.7.17 | DBM:續集專業

錯誤:MySQL表示:無法添加外鍵約束

CREATE TABLE `TASK` (
    `ID` int(11) unsigned NOT NULL AUTO_INCREMENT, 
    `USER_TOKEN` int(11) unsigned NOT NULL, 
    PRIMARY KEY (`ID`) 
) ENGINE=InnoDB DEFAULT CHARSET=utf8; 


CREATE TABLE `USER` (
    `ID` int(11) unsigned NOT NULL AUTO_INCREMENT, 
    `TOKEN` int(11) unsigned NOT NULL, 
    PRIMARY KEY (`ID`) 
) ENGINE=InnoDB DEFAULT CHARSET=utf8; 

ALTER TABLE USER 
ADD CONSTRAINT TOKENS 
FOREIGN KEY (`TOKEN`) REFERENCES `category`(`USER_TOKEN`) 

感謝。

+2

如果是,嘗試添加外鍵的代碼? – Barmar

+0

@Barmar對不起,我現在添加代碼。 – asaproG

+2

'category'表在哪裏? – Barmar

回答

-1

如果你確實想創建一個外鍵給非主鍵,它必須是一個對其具有約束條件的列(unique)。

FOREIGN KEY約束不必僅鏈接到另一個表中的PRIMARY KEY約束;它也可以被定義爲引用另一個表中的UNIQUE約束的列。

所以,你的表TASKUSERTOKENUSER_TOKEN欄必須爲UNIQUE。因此,運行以下查詢:

CREATE TABLE `TASK` (
`ID` int(11) unsigned NOT NULL AUTO_INCREMENT, 
`USER_TOKEN` int(11) unsigned NOT NULL UNIQUE, 
PRIMARY KEY (`ID`) 
) ENGINE=InnoDB DEFAULT CHARSET=utf8; 


CREATE TABLE `USER` (
`ID` int(11) unsigned NOT NULL AUTO_INCREMENT, 
`TOKEN` int(11) unsigned NOT NULL UNIQUE, 
PRIMARY KEY (`ID`) 
) ENGINE=InnoDB DEFAULT CHARSET=utf8; 


ALTER TABLE `USER` 
ADD CONSTRAINT `TOKENS` 
FOREIGN KEY (`TOKEN`) REFERENCES `TASK`(`USER_TOKEN`); 

檢查Demo here

+0

我嘗試這個,但是我得到一個錯誤 - 「無法添加外鍵約束」 – asaproG

+0

隨機更改您嘗試引用的表格可能會使事情變得更糟,而不是更好。 –

+0

我已經改變了答案,現在檢查 –