2012-02-27 92 views
10

我有一個表有2列,我從兩個不同的表複製。我現在要做的是給列名稱電子郵件和id的外鍵約束如下所示。改變表給外鍵約束

ALTER TABLE users_role_map 
ADD CONSTRAINT FK_users_role_map 
FOREIGN KEY (email) REFERENCES usert(email), 
FOREIGN KEY (id) REFERENCES rolet(id) 
ON UPDATE CASCADE 
ON DELETE CASCADE; 

我收到以下錯誤:

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 'FOREI 
GN KEY (id) REFERENCES rolet(id) 
ON UPDATE CASCADE 
ON DELETE CASCADE' at line 4 

回答

29

您不添加在此聲明的約束,要添加約束小號:每兩個foreign key子句的指獨立的約束。儘管如此,根據manual,您應該能夠根據需要在單個ALTER TABLE語句中添加任意數量的外鍵約束。您只需在每個約束之前包含ADD

請注意,約束名稱單獨應用於您要添加的約束,因此如果您希望它具有特定名稱,則可能需要爲第二個外鍵指定CONSTRAINT name。與ON UPDATE/ON DELETE相同:它們適用於直接在它們之前的外鍵。

因此,更正聲明,可能是這樣的:

ALTER TABLE users_role_map 

ADD CONSTRAINT FK_users_role_map1 
FOREIGN KEY (email) REFERENCES usert(email) 
ON UPDATE CASCADE ON DELETE CASCADE, 

ADD CONSTRAINT FK_users_role_map2 
FOREIGN KEY (id) REFERENCES rolet(id) 
ON UPDATE CASCADE 
ON DELETE CASCADE; 
+1

這看起來是正確的。根據我的經驗,我甚至沒有手動命名限制或索引,我讓MySQL在幕後處理它。 – 2012-02-28 21:10:53

+0

是的,命名是可選的。在SQL Server中,它也是可選的,但我更喜歡指定名稱。 – 2012-02-28 21:32:43

+0

只是好奇,爲什麼? – 2012-02-28 21:54:24