सारांश :इस ट्यूटोरियल में, आप सीखेंगे कि संबंधित तालिकाओं के बीच संबंधों को लागू करने के लिए 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 विदेशी कुंजी बाधा और संबंधित तालिकाओं के बीच संबंध को लागू करने के लिए उनका उपयोग करने के तरीके के बारे में सीखा है।