ऐसा लगता है productorder.oid
एक बहु-स्तंभ प्राथमिक कुंजी का हिस्सा है, और यह प्राथमिक कुंजी में सबसे बाईं ओर का स्तंभ नहीं है। (भविष्य में, कृपया SHOW CREATE TABLE <tablename>
का परिणाम शामिल करें क्योंकि यह बहु-स्तंभ कुंजियों जैसी चीज़ों के बारे में DESCRIBE से अधिक स्पष्ट है।)
जब आप एक विदेशी कुंजी घोषित करते हैं, तो आपको प्राथमिक कुंजी के सबसे बाएं कॉलम का संदर्भ देना चाहिए।
जब आप एक बहु-स्तंभ प्राथमिक कुंजी का संदर्भ देते हैं, तो विदेशी कुंजी में समान क्रम में स्तंभों की संख्या समान होनी चाहिए।
गलत (पर्याप्त कॉलम नहीं, और प्राथमिक कुंजी के दूसरे कॉलम को संदर्भित करना):
CREATE TABLE parent (x INT, y INT, PRIMARY KEY (x, y));
CREATE TABLE child (y INT, FOREIGN KEY (y) REFERENCES parent(y));
गलत (अलग-अलग विदेशी कुंजियां, जिनमें से प्रत्येक संयुक्त प्राथमिक कुंजी का हिस्सा है):
CREATE TABLE parent (x INT, y INT, PRIMARY KEY (x, y));
CREATE TABLE child (x INT, y INT,
FOREIGN KEY (x) REFERENCES parent(x),
FOREIGN KEY (y) REFERENCES parent(y)
);
दाएं (समान कॉलम):
CREATE TABLE parent (x INT, y INT, PRIMARY KEY (x, y));
CREATE TABLE child (x INT, y INT, FOREIGN KEY (x, y) REFERENCES parent(x, y));
अपनी टिप्पणी दें:
मैं अब सोच रहा हूं कि आपकी असली समस्या यह है कि आपने रिश्ते को उलट दिया है। आप deliveryaddress
. में एक विदेशी कुंजी घोषित करने का प्रयास कर रहे हैं productorder
का संदर्भ देना , लेकिन मुझे उम्मीद है कि संदर्भ दूसरी दिशा में जाएगा।
ALTER TABLE productorder ADD FOREIGN KEY (oid) REFERENCES deliveryaddress (oid);
तब आपको कोई त्रुटि नहीं है, क्योंकि deliveryaddress
. की प्राथमिक कुंजी सिर्फ एक कॉलम है।
मेरा मानना है कि यह संबंध एक विशिष्ट ई-कॉमर्स एप्लिकेशन में अधिक समझ में आता है। ऐसे कई आदेश हैं जो एक ही पते का संदर्भ दे सकते हैं। विपरीत संबंध शायद वह नहीं है जो आप चाहते हैं, क्योंकि इसका कोई मतलब नहीं है कि कई पतों के लिए एक ही उत्पाद ऑर्डर का संदर्भ दिया जाए।