2012-02-27 13 views
10

Mam tabelę, która ma 2 kolumny, które skopiowałem z dwóch różnych tabel. Co chcę teraz zrobić, to podać ograniczenie klucza obcego na obu nazwach kolumn i adresie e-mail pokazanym poniżej.Zmieniaj tabelę, aby podać ograniczenie klucza obcego.

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; 

pojawia się następujący błąd:

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 

Odpowiedz

29

Nie dodajesz ograniczenie w tym oświadczeniu, dodajesz ograniczenie s: każdy z dwóch ZAGRANICZNYCH klauzul KLUCZOWE oznacza oddzielną przymus. Mimo to, zgodnie z manual, powinieneś być w stanie dodać tyle ograniczeń klucza obcego w jednej instrukcji ALTER TABLE, jeśli to konieczne. Musisz tylko dodać ADD przed każdym ograniczeniem.

Należy pamiętać, że nazwy wiązań mają zastosowanie indywidualnie do dodawanych wiązań, dlatego warto podać CONSTRAINT name dla drugiego klucza obcego, jeśli ma on mieć określoną nazwę. To samo z ON UPDATE/ON DELETE: stosuje się do klucza obcego, który jest bezpośrednio przed nimi.

Więc skorygowana deklaracja może wyglądać następująco:

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

To wygląda poprawne. Z własnego doświadczenia nie wymieniam nawet ręcznie ograniczeń i indeksów, pozwalam MySQL radzić sobie z tym za kulisami. –

+0

Tak, nazywanie jest opcjonalne. W SQL Server, gdzie również jest opcjonalny, wolę jednak podać nazwy. –

+0

Po prostu ciekawy, dlaczego? –

Powiązane problemy