2012-02-27 48 views
10

Tôi có một bảng có 2 cột mà tôi đã sao chép từ hai bảng khác nhau.Điều tôi muốn làm bây giờ là cung cấp ràng buộc khóa ngoài cho cả email tên và id được hiển thị bên dưới.Thay đổi bảng để cung cấp ràng buộc khóa ngoài

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; 

tôi nhận được lỗi sau:

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 

Trả lời

29

Bạn chưa thêm một hạn chế trong bản Tuyên Bố này, bạn đang thêm chế s: mỗi hai mệnh đề KEY NƯỚC NGOÀI nghĩa là riêng biệt hạn chế. Tuy nhiên, theo manual, bạn sẽ có thể thêm nhiều ràng buộc khoá ngoại trong một câu lệnh ALTER TABLE đơn khi cần thiết. Bạn chỉ cần bao gồm ADD trước mọi ràng buộc. Lưu ý rằng các tên ràng buộc áp dụng riêng cho các ràng buộc mà bạn đang thêm vào, và vì vậy bạn có thể muốn chỉ định CONSTRAINT name cho khóa ngoài thứ hai nếu bạn muốn nó có một tên cụ thể. Quay lại đầu trang |||| Tương tự với ON UPDATE/ON DELETE: chúng áp dụng cho khóa ngoại tiếp ngay trước chúng.

Vì vậy, báo cáo kết quả khắc phục có thể trông như thế này:

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

này có vẻ đúng. Theo kinh nghiệm của tôi, tôi thậm chí không tự đặt tên cho các contraints hoặc index, tôi để MySQL xử lý nó đằng sau hậu trường. –

+0

Có, việc đặt tên là tùy chọn. Trong SQL Server, nơi mà nó là tùy chọn là tốt, tôi thích để xác định tên, mặc dù. –

+0

Chỉ tò mò thôi, tại sao? –

Các vấn đề liên quan