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

SQLite विदेशी कुंजी

सारांश :इस ट्यूटोरियल में, आप सीखेंगे कि संबंधित तालिकाओं के बीच संबंधों को लागू करने के लिए SQLite विदेशी कुंजी बाधा का उपयोग कैसे करें।

SQLite विदेशी कुंजी बाधा समर्थन

SQLite ने संस्करण 3.6.19 के बाद से विदेशी कुंजी बाधा का समर्थन किया है। SQLite लाइब्रेरी को भी न तो SQLITE_OMIT_FOREIGN_KEY और न ही SQLITE_OMIT_TRIGGER के साथ संकलित किया जाना चाहिए।

यह जांचने के लिए कि SQLite का आपका वर्तमान संस्करण विदेशी कुंजी बाधाओं का समर्थन करता है या नहीं, आप निम्न आदेश का उपयोग करते हैं।

PRAGMA foreign_keys;Code language: SQL (Structured Query Language) (sql)

आदेश एक पूर्णांक मान देता है:1:सक्षम, 0:अक्षम। यदि कमांड कुछ भी नहीं लौटाता है, तो इसका मतलब है कि आपका SQLite संस्करण विदेशी कुंजी बाधाओं का समर्थन नहीं करता है।

यदि SQLite लाइब्रेरी को विदेशी कुंजी बाधा समर्थन के साथ संकलित किया गया है, तो एप्लिकेशन PRAGMA foreign_keys का उपयोग कर सकता है। रनटाइम पर विदेशी कुंजी बाधाओं को सक्षम या अक्षम करने का आदेश।

विदेशी कुंजी बाधा को अक्षम करने के लिए:

PRAGMA foreign_keys = OFF;Code language: SQL (Structured Query Language) (sql)

विदेशी कुंजी बाधा सक्षम करने के लिए:

PRAGMA foreign_keys = ON;Code language: SQL (Structured Query Language) (sql)

SQLite विदेशी कुंजी बाधाओं का परिचय

आइए दो तालिकाओं से शुरू करें:suppliers और supplier_groups :

CREATE TABLE suppliers (
	supplier_id integer PRIMARY KEY,
	supplier_name text NOT NULL,
	group_id integer NOT NULL
);

CREATE TABLE supplier_groups (
	group_id integer PRIMARY KEY,
	group_name text NOT NULL
);Code language: SQL (Structured Query Language) (sql)

यह मानते हुए कि प्रत्येक आपूर्तिकर्ता एक और केवल एक आपूर्तिकर्ता समूह से संबंधित है। और प्रत्येक आपूर्तिकर्ता समूह में शून्य या कई आपूर्तिकर्ता हो सकते हैं। supplier_groups . के बीच संबंध और suppliers टेबल एक से कई हैं। दूसरे शब्दों में, suppliers . में प्रत्येक पंक्ति के लिए तालिका में, supplier_groups . में एक संगत पंक्ति है टेबल।

वर्तमान में, आपको suppliers . में एक पंक्ति जोड़ने से रोकने का कोई तरीका नहीं है supplier_groups . में संगत पंक्ति के बिना तालिका टेबल।

इसके अलावा, आप supplier_groups . में से एक पंक्ति को हटा सकते हैं suppliers . में संबंधित पंक्तियों को हटाए या अपडेट किए बिना तालिका टेबल। यह suppliers . में अनाथ पंक्तियों को छोड़ सकता है टेबल।

suppliers में पंक्तियों के बीच संबंध लागू करने के लिए और supplier_groups तालिका में, आप विदेशी कुंजी बाधाओं का उपयोग करते हैं ।

suppliers . में विदेशी कुंजी बाधा जोड़ने के लिए तालिका, आप CREATE TABLE . की परिभाषा बदलते हैं उपरोक्त कथन इस प्रकार है:

DROP TABLE suppliers;

CREATE TABLE suppliers (
    supplier_id   INTEGER PRIMARY KEY,
    supplier_name TEXT    NOT NULL,
    group_id      INTEGER NOT NULL,
    FOREIGN KEY (group_id)
       REFERENCES supplier_groups (group_id) 
);
Code language: SQL (Structured Query Language) (sql)

supplier_groups टेबल को पैरेंट टेबल . कहा जाता है , वह तालिका है जो एक विदेशी कुंजी संदर्भित करती है। suppliers तालिका को चाइल्ड टेबल . के रूप में जाना जाता है , वह तालिका जिस पर विदेशी कुंजी बाधा लागू होती है।

group_id supplier_groups . में कॉलम तालिका को पैरेंट कुंजी . कहा जाता है , जो एक स्तंभ या मूल तालिका में स्तंभों का एक समूह है जिसे विदेशी कुंजी बाधा संदर्भित करती है। आमतौर पर, पैरेंट की, पैरेंट टेबल की प्राथमिक कुंजी होती है।

group_id suppliers . में कॉलम टेबल को चाइल्ड की कहा जाता है। आम तौर पर, चाइल्ड कुंजी पैरेंट टेबल की प्राथमिक कुंजी का संदर्भ देती है।

SQLite विदेशी कुंजी बाधा उदाहरण

सबसे पहले, supplier_groups . में तीन पंक्तियाँ डालें टेबल।

INSERT INTO supplier_groups (group_name)
VALUES
   ('Domestic'),
   ('Global'),
   ('One-Time');Code language: SQL (Structured Query Language) (sql)

दूसरा, suppliers . में एक नया आपूर्तिकर्ता सम्मिलित करें आपूर्तिकर्ता समूह के साथ तालिका जो supplier_groups . में मौजूद है टेबल।

INSERT INTO suppliers (supplier_name, group_id)
VALUES ('HP', 2);Code language: SQL (Structured Query Language) (sql)

यह कथन बिलकुल ठीक काम करता है।

तीसरा, suppliers . में एक नया आपूर्तिकर्ता सम्मिलित करने का प्रयास करें आपूर्तिकर्ता समूह के साथ तालिका जो supplier_groups . में मौजूद नहीं है टेबल।

INSERT INTO suppliers (supplier_name, group_id)
VALUES('ABC Inc.', 4);Code language: SQL (Structured Query Language) (sql)

SQLite ने विदेशी कुंजी बाधा की जाँच की, परिवर्तन को अस्वीकार कर दिया, और निम्न त्रुटि संदेश जारी किया:

[SQLITE_CONSTRAINT]  Abort due to constraint violation (FOREIGN KEY constraint failed)Code language: CSS (css)

SQLite विदेशी कुंजी बाधा कार्रवाइयां

यदि आप supplier_groups . में एक पंक्ति हटाते हैं तो क्या होगा टेबल? suppliers में सभी संगत पंक्तियों को होना चाहिए तालिका भी हटा दी जाती है? अद्यतन कार्रवाई के लिए वही प्रश्न।

यह निर्दिष्ट करने के लिए कि जब भी पैरेंट कुंजी को हटाया या अपडेट किया जाता है तो विदेशी कुंजी बाधा कैसे व्यवहार करती है, आप ON DELETE का उपयोग करते हैं या ON UPDATE कार्रवाई इस प्रकार है:

FOREIGN KEY (foreign_key_columns)
   REFERENCES parent_table(parent_key_columns)
      ON UPDATE action 
      ON DELETE action;Code language: SQL (Structured Query Language) (sql)

SQLite निम्नलिखित क्रियाओं का समर्थन करता है:

  • शून्य सेट करें
  • डिफ़ॉल्ट सेट करें
  • प्रतिबंध
  • कोई कार्रवाई नहीं
  • कैस्केड

व्यवहार में, मूल तालिका में प्राथमिक कुंजी के मान नहीं बदलते हैं इसलिए अद्यतन नियम कम महत्वपूर्ण हैं। अधिक महत्वपूर्ण नियम है DELETE वह नियम जो पैरेंट कुंजी के हटाए जाने पर कार्रवाई को निर्दिष्ट करता है।

हम निम्नलिखित उदाहरण द्वारा प्रत्येक क्रिया की जांच करेंगे

शून्य सेट करें

जब पैरेंट कुंजी बदलती है, हटाती है या अपडेट करती है, तो चाइल्ड टेबल में सभी पंक्तियों की संबंधित चाइल्ड कुंजियाँ NULL पर सेट हो जाती हैं।

सबसे पहले, तालिका को ड्रॉप करें और बनाएं suppliers SET NULL . का उपयोग करके group_id . के लिए कार्रवाई विदेशी कुंजी:

DROP TABLE suppliers;

CREATE TABLE suppliers (
    supplier_id   INTEGER PRIMARY KEY,
    supplier_name TEXT    NOT NULL,
    group_id      INTEGER,
    FOREIGN KEY (group_id)
    REFERENCES supplier_groups (group_id) 
       ON UPDATE SET NULL
       ON DELETE SET NULL
);
Code language: SQL (Structured Query Language) (sql)

दूसरा, suppliers में कुछ पंक्तियाँ डालें टेबल:

INSERT INTO suppliers (supplier_name, group_id)
VALUES('XYZ Corp', 3);

INSERT INTO suppliers (supplier_name, group_id)
VALUES('ABC Corp', 3);Code language: SQL (Structured Query Language) (sql)

तीसरा, supplier_groups . से सप्लायर ग्रुप आईडी 3 को मिटाएं टेबल:

DELETE FROM supplier_groups 
WHERE group_id = 3;Code language: SQL (Structured Query Language) (sql)

चौथा, suppliers . से क्वेरी डेटा टेबल।

SELECT * FROM suppliers;Code language: SQL (Structured Query Language) (sql)

group_id . के मान suppliers . में संबंधित पंक्तियों का स्तंभ तालिका NULL पर सेट है।

डिफ़ॉल्ट सेट करें

SET DEFAULT जब आप तालिका बनाते हैं तो क्रिया विदेशी कुंजी के मान को स्तंभ परिभाषा में निर्दिष्ट डिफ़ॉल्ट मान पर सेट करती है।

क्योंकि कॉलम में मान group_id डिफ़ॉल्ट रूप से NULL, यदि आप supplier_groups . से कोई पंक्ति हटाते हैं तालिका, group_id . के मान NULL पर सेट हो जाएगा।

डिफ़ॉल्ट मान निर्दिष्ट करने के बाद, विदेशी कुंजी बाधा जांच में प्रवेश करती है और वहन करती है।

प्रतिबंध

RESTRICT क्रिया आपको मूल तालिका की मूल कुंजी में मानों को बदलने या हटाने की अनुमति नहीं देती है।

सबसे पहले, ड्रॉप करें और suppliers बनाएं RESTRICT के साथ तालिका विदेशी कुंजी में कार्रवाई group_id :

DROP TABLE suppliers;

CREATE TABLE suppliers (
    supplier_id   INTEGER PRIMARY KEY,
    supplier_name TEXT    NOT NULL,
    group_id      INTEGER,
    FOREIGN KEY (group_id)
    REFERENCES supplier_groups (group_id) 
       ON UPDATE RESTRICT
       ON DELETE RESTRICT
);Code language: SQL (Structured Query Language) (sql)

दूसरा, तालिका में एक पंक्ति डालें suppliers group_id 1.

. के साथ
INSERT INTO suppliers (supplier_name, group_id)
VALUES('XYZ Corp', 1);Code language: SQL (Structured Query Language) (sql)

तीसरा, supplier_groups . से आईडी 1 वाले सप्लायर ग्रुप को मिटाएं टेबल:

DELETE FROM supplier_groups 
WHERE group_id = 1;Code language: SQL (Structured Query Language) (sql)

SQLite ने निम्न त्रुटि जारी की:

[SQLITE_CONSTRAINT]  Abort due to constraint violation (FOREIGN KEY constraint failed)Code language: CSS (css)

इसे ठीक करने के लिए, आपको पहले suppliers . से सभी पंक्तियों को हटाना होगा तालिका जिसमें group_id . है 1:

DELETE FROM suppliers 
WHERE group_id =1;Code language: SQL (Structured Query Language) (sql)

फिर, आप आपूर्तिकर्ता समूह 1 को supplier_groups . से हटा सकते हैं टेबल:

DELETE FROM supplier_groups 
WHERE group_id = 1;Code language: SQL (Structured Query Language) (sql)

कोई कार्रवाई नहीं

NO ACTION इसका मतलब विदेशी कुंजी बाधा को बाय-पास नहीं करना है। इसका प्रभाव RESTRICT . के समान ही है ।

कैस्केड

CASCADE जब आप पैरेंट कुंजी को अपडेट करते हैं या हटाते हैं, तो क्रिया पैरेंट टेबल से चाइल्ड टेबल में बदलावों का प्रचार करती है।

सबसे पहले, suppliers डालें supplier_groups . में समूह टेबल:

INSERT INTO supplier_groups (group_name)
VALUES
   ('Domestic'),
   ('Global'),
   ('One-Time');Code language: SQL (Structured Query Language) (sql)

दूसरा, ड्रॉप करें और तालिका बनाएं suppliers CASCADE . के साथ विदेशी कुंजी में कार्रवाई group_id :

DROP TABLE suppliers;

CREATE TABLE suppliers (
    supplier_id   INTEGER PRIMARY KEY,
    supplier_name TEXT    NOT NULL,
    group_id      INTEGER,
    FOREIGN KEY (group_id)
    REFERENCES supplier_groups (group_id) 
       ON UPDATE CASCADE
       ON DELETE CASCADE
);Code language: SQL (Structured Query Language) (sql)

तीसरा, कुछ आपूर्तिकर्ताओं को तालिका में सम्मिलित करें suppliers :

INSERT INTO suppliers (supplier_name, group_id)
VALUES('XYZ Corp', 1);

INSERT INTO suppliers (supplier_name, group_id)
VALUES('ABC Corp', 2);Code language: SQL (Structured Query Language) (sql)

चौथा, अपडेट करें group_id Domestic . के 100 को आपूर्तिकर्ता समूह:

UPDATE supplier_groups
SET group_id = 100
WHERE group_name = 'Domestic';Code language: SQL (Structured Query Language) (sql)

पांचवां, तालिका से क्वेरी डेटा suppliers :

SELECT * FROM suppliers;Code language: SQL (Structured Query Language) (sql)

जैसा कि आप group_id . में मान देख सकते हैं XYZ Corp . का कॉलम तालिका में suppliers जब हमने group_id . को अपडेट किया तो 1 से बदलकर 100 कर दिया गया suplier_groups . में टेबल। यह ON UPDATE CASCADE . का परिणाम है कार्रवाई।

छठा, आपूर्तिकर्ता समूह आईडी 2 को supplier_groups . से हटाएं टेबल:

DELETE FROM supplier_groups 
WHERE group_id = 2;Code language: SQL (Structured Query Language) (sql)

सातवां, तालिका से क्वेरी डेटा suppliers :

SELECT * FROM suppliers;Code language: SQL (Structured Query Language) (sql)

आपूर्तिकर्ता आईडी 2 जिसका group_id . है 2 है तब हटा दिया गया था जब आपूर्तिकर्ता समूह आईडी 2 को supplier_groups . से हटा दिया गया था टेबल। यह ON DELETE CASCADE . का प्रभाव है कार्रवाई।

इस ट्यूटोरियल में, आपने 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. SQLite में डेटा एन्क्रिप्ट करें

  2. Android में sqlite डेटाबेस में बड़ी मात्रा में डेटा कैसे डालें?

  3. SQLite COUNT

  4. Android डिवाइस के लिए सुरक्षित डेटाबेस लागू करने का सर्वोत्तम अभ्यास

  5. त्रुटि ठीक करें:SQLite में "यूनियन के बाएं और दाएं चयन में परिणाम कॉलम की संख्या समान नहीं है"