SQLite में एक PRAGMA कथन शामिल है जो आपको संपूर्ण डेटाबेस या किसी तालिका पर विदेशी कुंजी उल्लंघनों की जांच करने की अनुमति देता है।
कथन है PRAGMA foreign_key_check
, और यह निम्नानुसार काम करता है।
सिंटैक्स
आप इसे दो में से एक तरीके से इस्तेमाल कर सकते हैं:
PRAGMA schema.foreign_key_check;
PRAGMA schema.foreign_key_check(table-name);
पहली पंक्ति पूरे डेटाबेस की जाँच करती है, जबकि दूसरी केवल एक विशिष्ट तालिका की जाँच करती है।
वैकल्पिक schema
तर्क संलग्न डेटाबेस का नाम निर्दिष्ट करता है या मुख्य या अस्थायी मुख्य और टीईएमपी डेटाबेस के लिए। अगर schema
छोड़ा गया है, मुख्य ऐसा माना जाता है।
उदाहरण
आइए उनके बीच संबंध के साथ दो टेबल बनाएं।
इस मामले में, पालतू जानवर तालिका में एक विदेशी कुंजी है जो TypeId . का संदर्भ देती है प्रकार . पर कॉलम टेबल।
CREATE TABLE Types(
TypeId INTEGER PRIMARY KEY,
Type
);
CREATE TABLE Pets(
PetId INTEGER PRIMARY KEY,
PetName,
TypeId,
FOREIGN KEY(TypeId) REFERENCES Types(TypeId)
);
अब डेटा दर्ज करें जो विदेशी कुंजी बाधा का उल्लंघन करता है।
PRAGMA foreign_keys = OFF;
INSERT INTO Types VALUES
( 1, 'Dog' ),
( 2, 'Cat' );
INSERT INTO Pets VALUES
( 1, 'Homer', 3 );
दूसरा INSERT
बयान विदेशी कुंजी बाधा का उल्लंघन करता है। ऐसा इसलिए है क्योंकि यह Pets.TypeId . में 3 का मान सम्मिलित करता है कॉलम, जब TypeId . में कोई संगत मान नहीं है कॉलम।
यहां ध्यान देने वाली एक महत्वपूर्ण बात यह है कि मैंने PRAGMA foreign_keys = OFF
का उपयोग करके स्पष्ट रूप से विदेशी कुंजियों को अक्षम कर दिया है। . यह SQLite में डिफ़ॉल्ट सेटिंग है, लेकिन मैं इस उदाहरण के लिए इसे स्पष्ट करना चाहता था।
आइए अब विदेशी कुंजी उल्लंघनों के लिए डेटाबेस की जाँच करें।
PRAGMA foreign_key_check;
परिणाम:
table rowid parent fkid ---------- ---------- ---------- ---------- Pets 1 Types 0
यह हमें बताता है कि पालतू जानवर तालिका में पंक्ति पर एक विदेशी कुंजी उल्लंघन है, जिसकी ROWID 1 है। यह हमें मूल तालिका का नाम, साथ ही विदेशी कुंजी आईडी भी बताती है।
आइए पालतू जानवरों में और डेटा जोड़ें तालिका और चेक फिर से चलाएँ। पहली दो पंक्तियाँ विदेशी कुंजी का पालन करती हैं, लेकिन अंतिम पंक्ति नहीं।
INSERT INTO Pets VALUES
( NULL, 'Yelp', 1 ),
( NULL, 'Fluff', 2 ),
( NULL, 'Brush', 4 );
PRAGMA foreign_key_check;
परिणाम:
table rowid parent fkid ---------- ---------- ---------- ---------- Pets 1 Types 0 Pets 4 Types 0
विदेशी कुंजी उल्लंघनों के लिए पूरे डेटाबेस की जाँच करते समय अब हमारे पास दो पंक्तियाँ हैं।
विशिष्ट तालिका जांचें
आप चेक को चलाने के लिए एक टेबल भी निर्दिष्ट कर सकते हैं।
यहां केवल पालतू जानवर . निर्दिष्ट करने के लिए पिछले चेक को फिर से लिखने का एक उदाहरण दिया गया है टेबल।
PRAGMA foreign_key_check(Pets);
परिणाम:
table rowid parent fkid ---------- ---------- ---------- ---------- Pets 1 Types 0 Pets 4 Types 0
वही परिणाम।
यदि मैं अन्य तालिका निर्दिष्ट करता हूं तो यह परिणाम है।
PRAGMA foreign_key_check(Types);
परिणाम:
(यह खाली है क्योंकि कोई परिणाम नहीं है।)
स्कीमा निर्दिष्ट करें
जैसा कि बताया गया है, आप स्कीमा भी निर्दिष्ट कर सकते हैं।
PRAGMA main.foreign_key_check(Pets);
परिणाम:
table rowid parent fkid ---------- ---------- ---------- ---------- Pets 1 Types 0 Pets 4 Types 0
मेरे मामले में मैंने मुख्य डेटाबेस का उपयोग किया था, लेकिन आप main
. को बदल सकते थे आपके संलग्न डेटाबेस के नाम के साथ।
विदेशी कुंजियों को कैसे लागू करें
जैसा कि उल्लेख किया गया है, SQLite विदेशी कुंजियों को तब तक लागू नहीं करता जब तक कि आप स्पष्ट रूप से निर्दिष्ट नहीं करते कि उन्हें लागू किया जाना चाहिए।
आप PRAGMA foreign_keys = ON
. का उपयोग करके विदेशी कुंजियों को लागू कर सकते हैं ।
अधिक जानकारी और उदाहरणों के लिए SQLite में विदेशी कुंजी समर्थन कैसे सक्षम करें देखें।