2012-02-27 59 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