2012-02-27 12 views
10

Ho una tabella che ha 2 colonne che ho copiato da due tabelle diverse. Quello che voglio fare ora è dare un vincolo di chiave esterna su entrambi i nomi di colonna email e id mostrati di seguito.Alter table per fornire il vincolo di chiave esterna

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; 

ottengo il seguente errore:

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 

risposta

29

Non si aggiunge un vincolo nella presente informativa, si sta aggiungendo vincolo s: ciascuna delle due clausole FOREIGN KEY significa un separato vincolo. Tuttavia, secondo lo manual, dovresti essere in grado di aggiungere tutti i vincoli di chiave esterna in una singola istruzione ALTER TABLE, se necessario. Hai solo bisogno di includere ADD prima di ogni vincolo.

Si noti che i nomi dei vincoli si applicano singolarmente ai vincoli che si aggiungono e pertanto è possibile specificare CONSTRAINT name per la seconda chiave esterna se si desidera che abbia un nome specifico. Lo stesso con ON UPDATE/ON DELETE: si applicano alla chiave esterna che li precede direttamente.

Quindi, l'affermazione corretta potrebbe essere simile a questo:

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

Questo sembra corretto. Nella mia esperienza, non nominerò nemmeno manualmente i punti di riferimento o gli indici, lascio che MySQL lo gestisca dietro le quinte. –

+0

Sì, la denominazione è facoltativa. In SQL Server, dove è anche opzionale, preferisco specificare i nomi, però. –

+0

Solo curioso, perché? –

Problemi correlati