आम तौर पर यदि आपको SQL में एक विदेशी कुंजी छोड़ने की आवश्यकता होती है, तो आप ALTER TABLE
का उपयोग करेंगे बयान। लेकिन अगर आप SQLite का उपयोग कर रहे हैं, तो यह कोई विकल्प नहीं है।
SQLite ALTER TABLE
. के बहुत सीमित उपसमुच्चय का समर्थन करता है बयान। केवल वही चीज़ें जो आप ALTER TABLE
. के साथ कर सकते हैं SQLite में एक तालिका का नाम बदलें, किसी तालिका के भीतर एक स्तंभ का नाम बदलें, या किसी मौजूदा तालिका में एक नया स्तंभ जोड़ें।
दूसरे शब्दों में, आप ALTER TABLE
. का उपयोग नहीं कर सकते हैं अन्य आरडीबीएमएस में आप की तरह एक विदेशी कुंजी छोड़ने के लिए
SQLite में एक विदेशी कुंजी को "ड्रॉप" करने का अनुशंसित तरीका वास्तव में डेटा को एक विदेशी कुंजी के बिना एक नई तालिका में स्थानांतरित करना है (या किसी अन्य के साथ, यदि आपको इसकी आवश्यकता है)।
अनुशंसित तरीका
SQLite दस्तावेज़ तालिका में स्कीमा परिवर्तन करने के लिए 12 चरणों की प्रक्रिया की अनुशंसा करता है। हम निम्नलिखित उदाहरण में एक विदेशी कुंजी को "ड्रॉप" करने के लिए उस प्रक्रिया का उपयोग करेंगे।
विदेशी कुंजी के साथ तालिका बनाएं
सबसे पहले, विदेशी कुंजी के साथ एक तालिका बनाएं और इसे डेटा से भरें।
CREATE TABLE Types(
TypeId INTEGER PRIMARY KEY,
Type
);
CREATE TABLE Pets(
PetId INTEGER PRIMARY KEY,
PetName,
TypeId,
FOREIGN KEY(TypeId) REFERENCES Types(TypeId)
);
INSERT INTO Types VALUES
( NULL, 'Dog' ),
( NULL, 'Cat' ),
( NULL, 'Parakeet' ),
( NULL, 'Hamster' );
INSERT INTO Pets VALUES
( NULL, 'Brush', 3 ),
( NULL, 'Tweet', 3 ),
( NULL, 'Yelp', 1 ),
( NULL, 'Woofer', 1 ),
( NULL, 'Fluff', 2 );
दरअसल, यहां मैंने दो टेबल बनाए और उन्हें डेटा से भर दिया। दो टेबल, क्योंकि पहली वाली (प्रकार ) की प्राथमिक कुंजी है और दूसरी (पालतू जानवर .) ) विदेशी कुंजी है। दूसरी तालिका की अंतिम पंक्ति में विदेशी कुंजी जोड़ी गई थी।
हम यह सत्यापित कर सकते हैं कि निम्न आदेश चलाकर विदेशी कुंजी बनाई गई थी:
PRAGMA foreign_key_list(Pets);
परिणाम:
id seq table from to on_update on_delete match -- --- ----- ------ ------ --------- --------- ----- 0 0 Types TypeId TypeId NO ACTION NO ACTION NONE
हम विदेशी कुंजी बाधा का विवरण देख सकते हैं।
अब विदेशी कुंजी को "ड्रॉप" करते हैं।
विदेशी कुंजी को "ड्रॉप" करें
निम्न कोड एक विदेशी कुंजी बाधा के बिना एक नई तालिका बनाकर, उस तालिका में डेटा स्थानांतरित करके, मूल तालिका को छोड़कर, फिर नई तालिका का नाम बदलकर मूल तालिका के नाम पर विदेशी कुंजी को "ड्रॉप" करता है।
PRAGMA foreign_keys = OFF;
BEGIN TRANSACTION;
CREATE TABLE Pets_new(
PetId INTEGER PRIMARY KEY,
PetName,
TypeId
);
INSERT INTO Pets_new SELECT * FROM Pets;
DROP TABLE Pets;
ALTER TABLE Pets_new RENAME TO Pets;
COMMIT;
PRAGMA foreign_keys = ON;
हो गया।
अगर आपको किसी इंडेक्स, ट्रिगर या व्यू को फिर से बनाना है, तो ALTER TABLE
के बाद ऐसा करें कथन जो तालिका का नाम बदलता है (COMMIT
. से ठीक पहले )
आइए अब फिर से विदेशी कुंजी बाधाओं के लिए तालिका देखें।
PRAGMA foreign_key_list(Pets);
परिणाम:
(यह खाली है क्योंकि इस टेबल पर कोई विदेशी कुंजी बाधा नहीं है।)
मौजूदा तालिका में विदेशी कुंजी जोड़ने के लिए आप उसी विधि का उपयोग कर सकते हैं।
एक वैकल्पिक तरीका
पिछले उदाहरण को देखते हुए, आप सोच रहे होंगे कि ऐसा करने का एक अधिक कुशल तरीका है। उदाहरण के लिए आप इसे इस तरह कर सकते हैं:
PRAGMA foreign_keys = OFF;
BEGIN TRANSACTION;
ALTER TABLE Pets RENAME TO Pets_old;
CREATE TABLE Pets(
PetId INTEGER PRIMARY KEY,
PetName,
TypeId
);
INSERT INTO Pets SELECT * FROM Pets_old;
DROP TABLE Pets_old;
COMMIT;
PRAGMA foreign_keys = ON;
और यह सच है। मेरे उदाहरण के साथ, यह विधि ठीक वैसे ही काम करती है।
लेकिन इस पद्धति में किसी भी मौजूदा ट्रिगर, दृश्य और विदेशी कुंजी बाधाओं में तालिका के संदर्भों को भ्रष्ट करने की क्षमता है।
इसलिए यदि आपकी तालिका में पहले से ही मौजूदा ट्रिगर, दृश्य या विदेशी कुंजी बाधाएं हैं, तो संभवतः अनुशंसित विधि का उपयोग करना अधिक सुरक्षित है।