SQLite किसी भी अन्य संबंधपरक डेटाबेस प्रबंधन प्रणाली की तरह ही संबंधों का समर्थन करता है।
SQLite एक संबंधपरक है डेटाबेस प्रबंधन प्रणाली (RDBMS)। यह उसी रिलेशनल मॉडल का उपयोग करता है जिसका उपयोग अन्य लोकप्रिय DBMS (जैसे MySQL, Oracle, SQL Server, MS Access) करते हैं।
इसका मतलब यह है कि आप कई टेबल बना सकते हैं, फिर उन्हें एक दूसरे से रिश्ते के माध्यम से लिंक कर सकते हैं ।
एक रिश्ता वह जगह है जहां आपके पास कई टेबल हैं जिनमें संबंधित डेटा होता है, और डेटा एक सामान्य मान से जुड़ा होता है जो दोनों तालिकाओं में संग्रहीत होता है।
निम्नलिखित आरेख इस अवधारणा को दर्शाता है:
तो, चलिए एल्बम called नामक एक और तालिका जोड़ते हैं , तो उसे हमारे कलाकारों . से लिंक करें एक रिश्ते के माध्यम से तालिका।
ऐसा करने से हम यह देखने में सक्षम होंगे कि दिया गया एल्बम किस कलाकार का है।
नई तालिका बनाएं
तो चलिए आगे बढ़ते हैं और एल्बम बनाते हैं तालिका:
CREATE TABLE Albums( AlbumId INTEGER PRIMARY KEY, AlbumName TEXT NOT NULL, Year TEXT NOT NULL, ArtistId INTEGER NOT NULL, FOREIGN KEY(ArtistId) REFERENCES Artists(ArtistId) );
ठीक उसी तरह जब हमने
कलाकार
बनाया था तालिका, हालांकि, इस पर, हमने FOREIGN KEY(ArtistId) REFERENCES Artists(ArtistId)
जोड़ दिया है कथन के अंत तक।
यह Albums.ArtistId . पर एक विदेशी कुंजी बाधा उत्पन्न करता है कॉलम। इसका मतलब यह है कि, इस कॉलम में डाला गया कोई भी डेटा Artists.ArtistId के मान से मेल खाना चाहिए। कॉलम।
अगर हमने ऐसा नहीं किया, तो ऐसा एल्बम होना संभव होगा जो किसी कलाकार का नहीं है। दूसरे शब्दों में, हम अपने डेटाबेस में अनाथ रिकॉर्ड रख सकते हैं। यदि आप संदर्भात्मक अखंडता बनाए रखने का प्रयास कर रहे हैं तो अच्छा नहीं है।
अब, अगर हम एक .tables
. चलाते हैं कमांड, हमें डेटाबेस में दोनों टेबल देखने चाहिए:
sqlite> .tables Albums Artists
संबंध का परीक्षण करें
एक बार जब हम विदेशी कुंजी के साथ तालिका बना लेते हैं, तो हम गलत डेटा दर्ज करने का प्रयास करके इसका परीक्षण कर सकते हैं। हम ArtistId . के साथ एक एल्बम दर्ज करने का प्रयास कर सकते हैं जो किसी ArtistId . से मेल नहीं खाता संदर्भित तालिका में (यानी कलाकार टेबल):
INSERT INTO Albums (AlbumName, Year, ArtistId) VALUES ('Powerslave', '1984', 70);
इसका परिणाम निम्न होना चाहिए:
sqlite> INSERT INTO Albums (AlbumName, Year, ArtistId) ...> VALUES ('Powerslave', '1984', 70); Error: FOREIGN KEY constraint failed
साथ ही, एक SELECT
चल रहा है टेबल पर स्टेटमेंट कोई डेटा नहीं लौटाएगा।
ऐसा इसलिए है क्योंकि विदेशी कुंजी बाधा ने गलत मान को सम्मिलित होने से रोक दिया है।
काम नहीं किया?
अगर इस तरह से गलत डेटा दर्ज करने का प्रयास करते समय आपको कोई त्रुटि नहीं मिलती है, तो आपको अपनी सेटिंग्स की जांच करने की आवश्यकता हो सकती है।
निम्न आदेश चलाएँ:PRAGMA foreign_keys;
अगर इसका परिणाम 0
. होता है इसका मतलब है कि आपकी विदेशी कुंजी बाधाएं अक्षम हैं। वास्तव में, यह SQLite का डिफ़ॉल्ट व्यवहार है (यह पश्चगामी संगतता के लिए है)।
विदेशी कुंजी बाधाओं को सक्षम करने के लिए, निम्न टाइप करें PRAGMA foreign_keys = ON;
अब, चल रहा है PRAGMA foreign_keys;
वापस आना चाहिए 1
, और बाद में अमान्य विदेशी कुंजी डालने के प्रयास विफल हो जाएंगे।
हालांकि, अगर PRAGMA foreign_keys;
कमांड कोई डेटा नहीं देता है, आपका SQLite कार्यान्वयन विदेशी कुंजी का समर्थन नहीं करता है (या तो क्योंकि यह संस्करण 3.6.19 से पुराना है या क्योंकि इसे SQLITE_OMIT_FOREIGN_KEY
के साथ संकलित किया गया था। या SQLITE_OMIT_TRIGGER
परिभाषित)।
अधिक डेटा डालें
अब जब संबंध स्थापित हो गया है, तो हम जितना चाहें उतना डेटा जोड़ सकते हैं, इस विश्वास के साथ कि केवल मान्य विदेशी कुंजी वाले रिकॉर्ड डाले जाएंगे।
INSERT INTO Albums VALUES (NULL, 'Killers', '1981', 7); INSERT INTO Albums VALUES (NULL, 'Powerslave', '1984', 7); INSERT INTO Albums VALUES (NULL, 'Surfing with the Alien', '1987', 1); INSERT INTO Albums VALUES (NULL, 'Heavy as a Really Heavy Thing', '1995', 11); INSERT INTO Albums VALUES (NULL, 'Yummy Yummy', '1994', 17); INSERT INTO Albums VALUES (NULL, 'Out of the Loop', '2007', 6); INSERT INTO Albums VALUES (NULL, 'Suck on This', '1989', 13); INSERT INTO Albums VALUES (NULL, 'Pork Soda', '1993', 13); INSERT INTO Albums VALUES (NULL, 'Sailing the Seas of Cheese', '1991', 13); INSERT INTO Albums VALUES (NULL, 'Flying in a Blue Dream', '1989', 1); INSERT INTO Albums VALUES (NULL, 'Black Swans and Wormhole Wizards', '2010', 1); INSERT INTO Albums VALUES (NULL, 'Somewhere in Time', '1986', 7); INSERT INTO Albums VALUES (NULL, 'Big Red Car', '1995', 17);
इसके बाद, हम JOIN
. का उपयोग करके दोनों तालिकाओं से डेटा का चयन करेंगे बयान।