एक विदेशी कुंजी बाधा परवाह नहीं है कि संदर्भित कॉलम किसी अन्य कॉलम को संदर्भित कर रहा है या नहीं। लेकिन संदर्भित कॉलम जरूरी विलक्षण हो। त्रुटि संदेश आपको यही बताता है (काफी स्पष्ट रूप से)।
आप जो खो रहे हैं वह यह है कि एक विदेशी कुंजी बाधा एकाधिक कॉलम पर आधारित हो सकती है . यह काम करना चाहिए:
FOREIGN KEY (num, user_id, assignment_id) REFERENCES submission
प्रतिस्थापित करना:
FOREIGN KEY (num) REFERENCES submission(num),
FOREIGN KEY (user_id) REFERENCES submission(user_id),
FOREIGN KEY (assignment_id) REFERENCES submission(assignment_id)
सिंटैक्स का संक्षिप्त रूप (REFERENCES submission ) संभव है, क्योंकि आप प्राथमिक कुंजी को संदर्भित कर रहे हैं, जो कि डिफ़ॉल्ट है।
साथ ही, आप सरल बना सकते हैं:submission.num बनाएं sinlge-column प्राथमिक कुंजी, अनावश्यक कॉलमों को छोड़ दें user_id और assignment_id correction . से और fk बाधा को केवल (num) . तक कम करें - जैसा कि @Tim's answer
में चर्चा की गई है .
जब तक आपके पास बहु-स्तंभ fk बाधा है, NOT NULL consider पर विचार करें प्रत्येक संदर्भित कॉलम पर बाधाएं (जैसा कि @joop द्वारा टिप्पणी की गई है)। अन्यथा, संदर्भित कॉलम में एक या अधिक NULL मान डिफ़ॉल्ट MATCH SIMPLE के साथ fk बाधा से बचने की अनुमति देते हैं व्यवहार। यह इरादा हो भी सकता है और नहीं भी, आमतौर पर यह नहीं है .
वैकल्पिक रूप से MATCH FULL . पर विचार करें बहुस्तंभ fk बाधाओं के लिए केवल तभी अनुमति दें जब सभी संदर्भित कॉलम न्यूल हैं। विवरण: