SQLite
 sql >> डेटाबेस >  >> RDS >> SQLite

SQLite में विदेशी कुंजी उल्लंघन खोजें

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 में विदेशी कुंजी समर्थन कैसे सक्षम करें देखें।


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. गतिविधि में सूची प्रदर्शित करने के लिए गतिविधि में कस्टम एडाप्टर कैसे जोड़ें?

  2. स्तम्भ _ID में त्रुटि नहीं है, हालांकि यह तालिका में मौजूद है

  3. ग्रीनडाओ फ्रीमेकर.जर गायब है

  4. एंड्रॉइड:डेटाबेस पंक्ति को हटाने के बाद सूची दृश्य को रीफ्रेश करने के लिए कर्सर की आवश्यकता कैसे करें?

  5. SQLite में तिथि के अनुसार कुल-आदेश चलाना