जब आप SQLite में कोई तालिका बनाते हैं, तो आप किसी अन्य तालिका के साथ संबंध स्थापित करने के लिए एक विदेशी कुंजी भी बना सकते हैं।
यह आलेख SQLite में तालिका बनाते समय एक विदेशी कुंजी बनाने का एक उदाहरण प्रदान करता है।
विदेशी कुंजी समर्थन सक्षम करें
पहली चीज जो हमें करनी चाहिए वह है विदेशी कुंजी समर्थन को सक्षम करना (यदि यह पहले से नहीं किया गया है)।
मान लें कि आपकी SQLite लाइब्रेरी नहीं है SQLITE_OMIT_FOREIGN_KEY
. के साथ संकलित किया गया है या SQLITE_OMIT_TRIGGER
परिभाषित किया गया है, फिर भी आपको रनटाइम पर विदेशी कुंजी समर्थन को सक्षम करने की आवश्यकता होगी।
ऐसा करने के लिए, निम्न कथन चलाएँ:
PRAGMA foreign_keys = ON;
यह आपके डेटाबेस कनेक्शन के लिए विदेशी कुंजी प्रवर्तन को सक्षम करेगा।
अगर आप दूसरा कनेक्शन खोलते हैं, तो आपको उस कनेक्शन के लिए वही स्टेटमेंट चलाना होगा।
ध्यान दें कि बनाने . के लिए इस सेटिंग की आवश्यकता नहीं है विदेशी कुंजी, लेकिन यह लागू करने . के लिए आवश्यक है विदेशी कुंजी।
अब जबकि हमने विदेशी कुंजी समर्थन सक्षम कर दिया है, आइए आगे बढ़ते हैं और एक विदेशी कुंजी बनाते हैं।
उदाहरण
कल्पना कीजिए कि हमें निम्नलिखित डेटा के साथ दो टेबल चाहिए।
पालतू जानवर . नामक तालिका :
PetId PetName TypeId ---------- ---------- ---------- 1 Brush 3 2 Tweet 3 3 Yelp 1 4 Woofer 1 5 Fluff 2
प्रकार . नामक तालिका एस:
TypeId Type ---------- ---------- 1 Dog 2 Cat 3 Parakeet 4 Hamster
और हम TypeId . चाहते हैं पालतू जानवर . का स्तंभ TypeId . को संदर्भित करने के लिए तालिका प्रकार . का स्तंभ टेबल।
दूसरे शब्दों में, हम Pets.TypeId . बनाना चाहते हैं चाइल्ड कुंजी (विदेशी कुंजी बाधा के साथ), और TypeId मूल कुंजी (प्राथमिक कुंजी बाधा के साथ)।
जबकि पैरेंट कुंजियाँ आमतौर पर तालिका के लिए प्राथमिक कुंजी भी होती हैं, यह वास्तव में एक आवश्यकता नहीं है। इस उदाहरण में हम इसे प्राथमिक कुंजी बनाएंगे।
इन दो तालिकाओं को बनाने के लिए हम निम्नलिखित कोड का उपयोग कर सकते हैं।
CREATE TABLE Types(
TypeId INTEGER PRIMARY KEY,
Type
);
CREATE TABLE Pets(
PetId INTEGER PRIMARY KEY,
PetName,
TypeId,
FOREIGN KEY(TypeId) REFERENCES Types(TypeId)
);
विदेशी कुंजी बनाने वाला भाग यह है:
FOREIGN KEY(TypeId) REFERENCES Types(TypeId)
FOREIGN KEY(TypeId)
भाग घोषित करता है Pets.TypeId विदेशी कुंजी के रूप में।
हालांकि मैं कॉलम नाम को उसके टेबल नाम के साथ योग्य नहीं बना पाया, हम जानते हैं कि यह Pets.TypeId है (और नहीं TypeId ) क्योंकि हम इसे CREATE TABLE
. में चला रहे हैं पालतू जानवरों . के लिए कथन ।
REFERENCES Types(TypeId)
उस कॉलम को निर्दिष्ट करता है जिसे हमारी विदेशी कुंजी संदर्भित करेगी। इस मामले में यह TypeId . का संदर्भ देगा प्रकार . का स्तंभ टेबल।
अब जब हमारे टेबल उपयुक्त विदेशी कुंजी के साथ बनाए गए हैं, तो हम डेटा जोड़ सकते हैं।
INSERT INTO Types VALUES
( NULL, 'Dog' ),
( NULL, 'Cat' ),
( NULL, 'Parakeet' ),
( NULL, 'Hamster' );
INSERT INTO Pets VALUES
( NULL, 'Brush', 3 ),
( NULL, 'Tweet', 3 ),
( NULL, 'Yelp', 1 ),
( NULL, 'Woofer', 1 ),
( NULL, 'Fluff', 2 );
तालिका में अब ऊपर दिखाया गया डेटा है।
sqlite> SELECT * FROM Pets;
PetId PetName TypeId
---------- ---------- ----------
1 Brush 3
2 Tweet 3
3 Yelp 1
4 Woofer 1
5 Fluff 2
sqlite> SELECT * FROM Types;
TypeId Type
---------- ----------
1 Dog
2 Cat
3 Parakeet
4 Hamster
विदेशी कुंजी उल्लंघन
लेकिन अब आइए विदेशी कुंजी का उल्लंघन करने वाले डेटा को सम्मिलित करने का प्रयास करें।
आइए एक ऐसे पालतू जानवर को जोड़ने का प्रयास करें जो अस्तित्वहीन TypeID . का उपयोग करता है (यानी एक TypeId मान जो प्रकार . में मौजूद नहीं है कॉलम)।
INSERT INTO Pets VALUES
( NULL, 'Homer', 5 );
परिणाम:
Error: FOREIGN KEY constraint failed
इसलिए हमारी विदेशी कुंजी ने खराब डेटा को डेटाबेस में प्रवेश करने से सफलतापूर्वक रोका। इसलिए, इसने हमें डेटा अखंडता बनाए रखने में मदद की।
यदि आपको यह त्रुटि नहीं मिलती है, और डेटा सफलतापूर्वक डाला गया था, तो आपने विदेशी कुंजी समर्थन सक्षम नहीं किया है। जैसा कि बताया गया है, आपकी विदेशी कुंजी लागू होने से पहले आपको विदेशी कुंजी समर्थन सक्षम करना होगा।
मौजूदा तालिका में विदेशी कुंजी जोड़ना
ALTER TABLE
SQLite में कथन बहुत सीमित है, और यह किसी मौजूदा तालिका में विदेशी कुंजी जोड़ने की अनुमति नहीं देता है।
इसलिए, यदि आपको किसी मौजूदा तालिका में एक विदेशी कुंजी जोड़ने की आवश्यकता है, तो आपको तालिका को छोड़ना होगा और इसे फिर से विदेशी कुंजी बाधा के साथ बनाना होगा।
यदि तालिका में वह डेटा है जिसे आप रखना चाहते हैं, तो आप उस डेटा को दूसरी तालिका में स्थानांतरित कर सकते हैं, एक बार विदेशी कुंजी बाधा के साथ नई तालिका बनाने के बाद उसे वापस स्थानांतरित करने से पहले।