तालिका 2 विदेशी कुंजी बाधा का अर्थ है कि कोई भी तालिका 2 ग्राहक आईडी मान तालिका 1 में ग्राहक आईडी के रूप में प्रकट होना चाहिए। आपको त्रुटि मिल रही है क्योंकि आप तालिका 2 में एक ग्राहक आईडी डाल रहे हैं जो तालिका 1 में प्रकट नहीं होता है।
चूंकि डीबीएमएस ऑटो इंक्रीमेंट द्वारा तालिका 1 ग्राहक आईडी उत्पन्न कर रहा है, यदि आप एक पंक्ति सम्मिलित करते हैं तो आपको उस ग्राहक आईडी का उपयोग करके तालिका 2 में एक पंक्ति सम्मिलित करने के लिए वह मान प्राप्त करना होगा।
मुझे लगता है कि आप कहते हैं "मैंने पहले ही तालिका 1 और तालिका 2 के बीच संबंध स्थापित कर लिया है" जिसका अर्थ है "मैंने एक विदेशी कुंजी बाधा घोषित की"। और मुझे लगता है कि आपको लगता है कि इसका अर्थ है "जब मैं तालिका 1 में सम्मिलित करता हूं तो डीबीएमएस ऑटो-जेनरेटेड कुंजी मान का उपयोग विदेशी कुंजी मान के रूप में करेगा जब मैं तालिका 2 में डालूंगा"। लेकिन इसका मतलब यह नहीं है। यह आपको खुद करना होगा। विदेशी कुंजी बाधा का अर्थ यह है कि DBMS यह जाँचता है कि प्रत्येक तालिका 2 ग्राहक आईडी मान तालिका 1 ग्राहक आईडी मान के रूप में प्रकट होता है।
जब आप उस कुंजी की विदेशी कुंजी वाली तालिका में सम्मिलित करते हैं, तो आप किसी भी पूर्व सम्मिलित कुंजी मान को संगत मान के रूप में उपयोग कर सकते हैं और अवश्य करना चाहिए।
DBMS द्वारा जेनरेट किए गए ऑटो इंक्रीमेंटेड की वैल्यू को वापस पाने के लिए का उपयोग करें। LAST_INSERT_ID() :
INSERT INTO table1 (CustomerName,Address,State)
VALUES('value1','value2','value3');
INSERT INTO table2 (customerId,product,cost)
VALUES(LAST_INSERT_ID(),'valueA','valueB');
इसके लिए यही है। लेकिन अगर आप इसका इस्तेमाल नहीं करते हैं तो यहां समस्याएं हैं।
सबसे पहले, यदि आप क्रमबद्ध लेनदेन में नहीं हैं तो आपको LAST_INSERT_ID() का उपयोग करना चाहिए। क्योंकि आपके टेबल 1 डालने के बाद लेकिन आपके टेबल 2 डालने से पहले अन्य लोग आपकी नई पंक्ति और/या बदली हुई पंक्तियों सहित आपकी नई पंक्ति सहित पंक्तियों और/या हटाई गई पंक्तियों को जोड़ सकते थे। इसलिए आप तालिका 1 को सम्मिलित करने के बाद कुछ ग्राहक आईडी मान प्राप्त करने के बाद क्वेरी करने पर भरोसा नहीं कर सकते हैं जिसे आप जानते हैं कि आपने जोड़ा है।
दूसरा, मान लें कि आप एक क्रमबद्ध लेनदेन में हैं और आप LAST_INSERT_ID() का उपयोग नहीं करते हैं।
अगर (ग्राहक नाम, पता, राज्य) भी एक सुपरकी है तालिका 1 का, यानी इसके मान अद्वितीय हैं, अर्थात SQL UNIQUE/KEY/PK को इसके सभी या कुछ स्तंभों पर घोषित किया गया है, फिर आप संबंधित नए ग्राहक के लिए क्वेरी करने के लिए इसका उपयोग कर सकते हैं:
set @customerId = (
SELECT customerId
FROM table1
WHERE CustomerName = 'value1'
AND Address = 'value2'
AND State = 'value3');
INSERT INTO table2 (customerId,product,cost)
VALUES(@customerId,'valueA','valueB');
लेकिन अगर (ग्राहक नाम, पता, राज्य) सुपरकी नहीं है तालिका 1 के तो आप ऐसा नहीं कर सकते। क्योंकि अन्य पंक्तियाँ जो उस सबरो के लिए डुप्लीकेट हैं, तालिका 1 में हो सकती हैं। तो आप कई पंक्तियों को वापस प्राप्त कर सकते हैं। तो आपको नहीं पता होगा कि सबसे नया कौन सा है। इसके बजाय आपको सम्मिलित करने से पहले तालिका 1 को क्वेरी करना होगा, फिर सम्मिलित करना होगा, फिर ग्राहक आईडी के पुराने और नए सेट के बीच अंतर ज्ञात करना होगा:
CREATE TEMPORARY TABLE table1old (
customerId (int) PRIMARY KEY
);
INSERT INTO table1old
SELECT customerId FROM table1;
INSERT INTO table1 (CustomerName,Address,State)
VALUES('value1','value2','value3');
set @customerId = (
SELECT customerId
FROM table1
WHERE CustomerName NOT IN table1old);
INSERT INTO table2 (customerId,product,cost)
VALUES(@customerId,'valueA','valueB');
बस LAST_INSERT_ID() का उपयोग करें।
पुनश्च:दिलचस्प है, तालिका परिभाषाओं को देखते हुए, आदर्श रूप से कोई भी लिख सकता है:
INSERT INTO (
SELECT CustomerName,Address,State,A,B
FROM table1 JOIN table2
USING (CustomerId))
VALUES('value1','value2','value3','valueA','valueB')
चूंकि नई तालिका 1 और तालिका 2 मानों की केवल एक जोड़ी है जो परिणाम दे सकती है। SQL में विचारों के माध्यम से कुछ कानूनी अपडेट हैं, हालांकि वर्तमान में MySQL में एक से अधिक टेबल शामिल नहीं हैं