2013-03-11 102 views
5

我在MySQL的InnoDB表像創建:MySQL的 - 不能添加外鍵

CREATE TABLE `users` (
    `id` bigint(20) NOT NULL AUTO_INCREMENT, 
    `type` enum('MANUAL','FACEBOOK') NOT NULL DEFAULT 'MANUAL', 
    `role` enum('COOK','HOST','ALL') NOT NULL DEFAULT 'ALL', 
    `about_me` varchar(1000) DEFAULT NULL, 
    `food_preferences` varchar(1000) DEFAULT NULL, 
    `cooking_experience` varchar(1000) DEFAULT NULL, 
    `with_friend` bit(1) DEFAULT b'0', 
    PRIMARY KEY (`id`) 
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8 

接下來,我嘗試添加一個表,這樣的聲明(無外鍵在創建表與有問題的補充那):

CREATE TABLE `messages` (
    `id` bigint(20) NOT NULL AUTO_INCREMENT, 
    `from` bigint(20) NOT NULL, 
    `to` bigint(20) NOT NULL, 
    `content` varchar(10000) NOT NULL, 
    `timestamp_sent` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, 
    `timestamp_read` timestamp NULL DEFAULT NULL, 
    PRIMARY KEY (`id`) 
) ENGINE=InnoDB DEFAULT CHARSET=utf8 

有表創建的,我需要最後在'from''to'領域引用'users'.'id'字段添加外鍵:

ALTER TABLE `messages` 
    ADD CONSTRAINT `messages_users_fk` 
    FOREIGN KEY (`from` , `to`) 
    REFERENCES `users` (`id` , `id`) 
    ON DELETE SET NULL 
    ON UPDATE CASCADE 
, ADD INDEX `messages_users_fk_idx` (`from` ASC, `to` ASC) 

我得到的錯誤是:

ERROR: Error 1822: Failed to add the foreign key constraint. Missing index for constraint 'messages_users_fk' in the referenced table 'users'.

但「用戶」表上'id'一個PRIMARY指數...

也試過做一個小的步驟加入外鍵只爲'from'場:

ALTER TABLE `messages` 
    ADD CONSTRAINT `messages_users_fk` 
    FOREIGN KEY (`from`) 
    REFERENCES `users` (`id`) 
    ON DELETE SET NULL 
    ON UPDATE CASCADE 
, ADD INDEX `messages_users_fk_idx` (`from` ASC) ; 

的錯誤是稍有不同:

ERROR: Error 1825: Failed to add the foreign key constraint on table 'messages'. Incorrect options in FOREIGN KEY constraint 'cook4food/messages_users_fk'.

字段類型相同(bigint(20) NOT NULL),因爲它被認爲是其他StackOverflow線程中問題的原因。我的表沒有分區(MySQL手冊聲明這是對InnoDB中的外鍵約束的限制)。 'messages'表目前不存在任何行,因此存儲的數據不能以任何方式出現問題。我卡住了,請幫忙。

+1

+1很可愛地看到實際的CREATE TABLE語句和他們一起玩:) – 2013-03-11 12:34:53

回答

0

REFERENCES用戶( ID , ID )

您正試圖創建一個無效的外鍵(ID,ID)。涉及組合索引(涉及多個列的列)的列不能重複列。至少我從來沒有見過。

創建兩個獨立的外鍵,一個用於FROM,另一個用於TO,每個用於指向用戶。

+0

是的,我正在考慮這兩種方法的區別。單獨的外鍵是我真正需要的。謝謝。 – 2013-03-11 13:47:49

14

如果具有相應的權限,你可以發出此查詢:

SHOW ENGINE innodb STATUS 

...它會告訴你(以及其他一些信息)錯誤的具體細節:

------------------------ 
LATEST FOREIGN KEY ERROR 
------------------------ 
130311 13:30:06 Error in foreign key constraint of table test/#sql-71c_6: 

    FOREIGN KEY (`from` , `to`) 
    REFERENCES `users` (`id` , `id`) 
    ON DELETE SET NULL 
    ON UPDATE CASCADE 
, ADD INDEX `messages_users_fk_idx` (`from` ASC, `to` ASC): 
You have defined a SET NULL condition though some of the 
columns are defined as NOT NULL. 

對於父記錄刪除,您不能使子記錄爲NULL,因爲列是NOT NULL

`from` bigint(20) NOT NULL, 
    `to` bigint(20) NOT NULL, 

編輯:另外,我看不到單個組合鍵的用途。我想你想要兩個單一的鍵。

+1

StackOverflow社區始終如此:-)。我現在可以看到我的錯誤,謝謝! – 2013-03-11 13:44:50

+1

如果'SHOW ENGINE innodb STATUS'沒有顯示最新的外鍵錯誤,有什麼想法嗎? – antonagestam 2014-06-30 13:26:41

+0

謝謝你! +1阿拉瓦羅。你從第二晚就救了我!再次感謝。 – 2015-03-18 07:51:25

0

正如我們所看到的,

在子記錄,則不能定義SET NULL當孩子列fromto不爲空。

因此,如果您嘗試使用以下2條語句創建外鍵,則應該在messages表中具有外鍵。

1>

ALTER TABLE `messages` ADD CONSTRAINT `messages_users_from_fk` FOREIGN KEY (`from`) REFERENCES `users` (`id`) ON DELETE CASCADE ON UPDATE CASCADE, ADD INDEX `messages_users_fk_idx` (`from` ASC) ; 

2>

ALTER TABLE `messages` ADD CONSTRAINT `messages_users_to_fk` FOREIGN KEY (`to`) REFERENCES `users` (`id`) ON DELETE CASCADE ON UPDATE CASCADE, ADD INDEX `messages_users_fk_to_idx` (`to` ASC) ; 

希望這些語句幫助你。