2012-09-27 40 views
2

我運行MySQL 54年5月1日 - lubuntu4MySQL 5.1中 - 錯誤添加外鍵約束

我有一個表

CREATE TABLE `mcli` (
    `id` bigint(20) NOT NULL, 
    `pr_id` bigint(20) DEFAULT NULL, 
    PRIMARY KEY (`id`), 
    KEY `FK7617032AB07F537D` (`id`), 
    KEY `FK7617032A4007E4D7` (`pr_id`), 
    CONSTRAINT `FK7617032AB07F537D` FOREIGN KEY (`id`) REFERENCES `acli` (`id`) 
) ENGINE=InnoDB DEFAULT CHARSET=utf8 

而且這個表中有數據。

我有另一個表

CREATE TABLE `PR` (
    `id` bigint(20) NOT NULL AUTO_INCREMENT, 
    `frequency` varchar(255) DEFAULT NULL, 
    `notes` varchar(255) DEFAULT NULL, 
    PRIMARY KEY (`id`), 
    KEY `FKPRtoAR` (`id`), 
    CONSTRAINT `FKPRtoAR` FOREIGN KEY (`id`) REFERENCES `AR` (`id`) 
) ENGINE=InnoDB AUTO_INCREMENT=22 DEFAULT CHARSET=utf8 

此表也有它的數據。

mcli.pr_id(表mcli,字段id)的所有行中的數據都是pr.id中的有效條目(因爲這是我將OLDPR表遷移到PR之前在另一個表OLDPPR中的內容。事實上mcli.pr_id用於擁有OLDPR.id的外鍵(舊錶的id字段)

我想添加一個將mcli.pr_id綁定到PR.id的外鍵約束正如你所看到的從架構,我已經在mcli.pr_id稱爲FK7617032A4007E4D7創建一個索引。於是,我就運行命令生成一個外鍵約束。

mysql> ALTER TABLE `mcli` ADD CONSTRAINT `FK7617032A4007E4D7` FOREIGN KEY (`pr_id`) REFERENCES `PR` (`id`); 
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'ADD CONSTRAINT `FK7617032A4007E4D7` FOREIGN KEY (`pr_id`) REFERENCES ' at line 1 
mysql> 

我也嘗試過所有的沖洗來自mcli的數據並重新運行該命令以添加外鍵約束,但它仍然給出相同的錯誤。我嘗試了單引號和沒有引號。網絡上的所有內容都表明我擁有正確的語法。我究竟做錯了什麼?

我感謝任何幫助,我可以得到。

回答

1

這只是一個受過教育的猜測,我沒有環境來測試它。

解析器可能會因爲已經存在一個具有相同名稱的密鑰而被混淆,即使在嚴格地說,語法沒有問題的情況下也會導致語法錯誤。

嘗試使用另一個約束名稱,以驗證行爲。

然後,嘗試刪除該鍵:

KEY `FK7617032A4007E4D7` (`pr_id`), 

添加約束之前:

ALTER TABLE `mcli` ADD CONSTRAINT `FK7617032A4007E4D7` FOREIGN KEY (`pr_id`) REFERENCES `PR` (`id`); 

我不能在最近的5.1版重現此。

+0

我試過了。我也嘗試刪除「ADD CONSTRAINT」子句。它有時但並非每次都有效。我最終的解決方法是克隆子表,刪除原始子表,創建原始子表名,並從克隆中取回數據。 –