2012-02-27 8 views
10

मेरे पास एक सारणी है जिसमें दो कॉलम हैं जिन्हें मैंने दो अलग-अलग तालिकाओं से कॉपी किया है। अब मैं जो करना चाहता हूं वह कॉलम नाम ईमेल और आईडी दोनों पर एक विदेशी कुंजी बाधा प्रदान करता है।विदेशी कुंजी बाधा देने के लिए तालिका बदलें

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

आप इस बयान में एक बाधा को जोड़ने नहीं कर रहे हैं, तो आप बाधा जोड़ रहे हैं रों: दो विदेशी कुंजी खंड में से प्रत्येक के लिए एक अलग अर्थ है बाधा। फिर भी, manual के अनुसार, आपको आवश्यकतानुसार एक वैकल्पिक तालिका कथन में कई विदेशी कुंजी बाधाओं को जोड़ने में सक्षम होना चाहिए। आपको हर बाधा से पहले 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

यह सही लग रहा है। मेरे अनुभव में, मैं मैन्युअल रूप से बाधाओं या सूचकांकों का नाम भी नहीं देता हूं, मैंने माईएसक्यूएल को दृश्यों के पीछे इसे संभालने दिया है। –

+0

हां, नामकरण वैकल्पिक है। SQL सर्वर में, जहां यह वैकल्पिक भी है, मैं नाम निर्दिष्ट करना पसंद करता हूं, हालांकि। –

+0

बस उत्सुक, क्यों? –

संबंधित मुद्दे