इस लेख में मूल SQL DELETE शामिल है बयान जो शुरुआती अपने डेटाबेस टेबल से डेटा को हटाने के लिए उपयोग कर सकते हैं।
एकल पंक्ति हटाएं
यहां SQL का मूल उदाहरण दिया गया है DELETE बयान।
DELETE FROM Owners
WHERE OwnerId = 5;
इस मामले में हम उस पंक्ति को हटा देते हैं जहां OwnerId कॉलम का मान 4 . है ।
DELETE स्टेटमेंट DELETE FROM से शुरू होता है , उसके बाद तालिका का नाम (यानी वह तालिका जिसमें वह डेटा है जिसे आप हटाना चाहते हैं)।
कुछ डेटाबेस मैनेजमेंट सिस्टम (DBMS) में, FROM कीवर्ड वैकल्पिक है, लेकिन बेहतर पोर्टेबिलिटी के लिए इसे शामिल करना एक अच्छा विचार है (यदि आपको एक ही कोड को एक अलग DBMS पर चलाने की आवश्यकता है)।
आपको हमेशा एक WHERE . शामिल करना चाहिए खंड, जब तक कि आप तालिका से सभी पंक्तियों को हटाना नहीं चाहते।
हां, आपने उसे सही पढ़ा है। WHERE . को छोड़ना क्लॉज तालिका की सभी पंक्तियों को हटा देगा।
अधिकांश DBMS में कई अन्य विकल्प होते हैं जिनका उपयोग आप DELETE . के साथ कर सकते हैं कथन, लेकिन यहां सूचीबद्ध सबसे अधिक उपयोग किए जाने वाले हैं।
ध्यान दें कि DELETE कथन पूरी पंक्ति को हटा देता है। आप एक पंक्ति में किसी एक कॉलम का मान नहीं हटा सकते। ऐसा करने के लिए, SQL UPDATE का उपयोग करें बयान।
उदाहरण
इस उदाहरण में, हम तालिका से डेटा हटाते हैं।
सबसे पहले, आइए देखें कि तालिका में क्या है।
SELECT * FROM Owners; परिणाम:
+-----------+-------------+------------+----------------+-------------------+ | OwnerId | FirstName | LastName | Phone | Email | |-----------+-------------+------------+----------------+-------------------| | 1 | Homer | Connery | (308) 555-0100 | example@sqldat.com | | 2 | Bart | Pitt | (231) 465-3497 | example@sqldat.com | | 3 | Nancy | Stallone | (489) 591-0408 | NULL | | 4 | Boris | Biden | (349) 611-8908 | example@sqldat.com | | 5 | Woody | Eastwood | (308) 555-0112 | example@sqldat.com | +-----------+-------------+------------+----------------+-------------------+
ठीक है, मालिक संख्या 5 को हटा दें, फिर तालिका का चयन करें।
DELETE FROM Owners
WHERE OwnerId = 5;
SELECT * FROM Owners; परिणाम:
+-----------+-------------+------------+----------------+-------------------+ | OwnerId | FirstName | LastName | Phone | Email | |-----------+-------------+------------+----------------+-------------------| | 1 | Homer | Connery | (308) 555-0100 | example@sqldat.com | | 2 | Bart | Pitt | (231) 465-3497 | example@sqldat.com | | 3 | Nancy | Stallone | (489) 591-0408 | NULL | | 4 | Boris | Biden | (349) 611-8908 | example@sqldat.com | +-----------+-------------+------------+----------------+-------------------+
हम देख सकते हैं कि अंतिम पंक्ति को निर्दिष्ट के अनुसार हटा दिया गया है।
विदेशी कुंजी
यदि आप किसी अन्य तालिका में किसी विदेशी कुंजी द्वारा संदर्भित डेटा को हटाने का प्रयास करते हैं तो आपको एक त्रुटि मिल सकती है। ऐसा इसलिए है क्योंकि आप जिस तालिका से डेटा हटाने का प्रयास कर रहे हैं, वह संबंध में मूल तालिका है। विदेशी कुंजी वाली तालिका (चाइल्ड टेबल) पैरेंट टेबल के डेटा पर निर्भर करती है (यानी वह डेटा जिसे आप हटाने की कोशिश कर रहे हैं)।
आपको कोई त्रुटि मिलती है या नहीं यह इस बात पर निर्भर करेगा कि विदेशी कुंजी कैसे कॉन्फ़िगर की गई थी। अधिकांश डीबीएमएस इस स्थिति से निपटने के लिए विभिन्न विकल्पों का समर्थन करते हैं। इस तरह के विकल्पों में शामिल हो सकते हैं, एक त्रुटि उठाना, विदेशी कुंजी तालिका में हटाना (यानी चाइल्ड टेबल से पंक्ति को हटाना), विदेशी कुंजी को NULL पर सेट करना शामिल हो सकता है। , या इसे इसके डिफ़ॉल्ट मान पर सेट करना।
एक विदेशी कुंजी द्वारा संदर्भित पंक्ति को हटाने का प्रयास करने का एक उदाहरण यहां दिया गया है।
DELETE FROM Owners
WHERE OwnerId = 3; परिणाम:
Msg 547, Level 16, State 0, Line 1 The DELETE statement conflicted with the REFERENCE constraint "FK_Pets_Owners". The conflict occurred in database "PetHotel", table "dbo.Pets", column 'OwnerId'. The statement has been terminated.
इस मामले में, एक त्रुटि उठाई गई थी, और पंक्ति को हटाया नहीं गया था।
इस उदाहरण में, Owners.OwnerId कॉलम इस तालिका की प्राथमिक कुंजी है। Pets called नामक एक अन्य तालिका एक OwnerId है कॉलम जो इस प्राथमिक कुंजी कॉलम को संदर्भित करता है, और इस मामले में, कम से कम एक पंक्ति है जो स्वामी संख्या 3 को संदर्भित कर रही है।
अगर मैं वास्तव में इस पंक्ति को हटाना चाहता हूं, तो मुझे बाल तालिका में डेटा अपडेट करना होगा ताकि कोई भी पंक्ति इस मालिक को इंगित न करे। या तो, या विदेशी कुंजी को संशोधित करें ताकि प्राथमिक कुंजी पर डिलीट ऑपरेशन होने पर यह एक अलग विकल्प का उपयोग करे। आपको जो करना है उसके आधार पर एक विदेशी कुंजी को संशोधित करना एक अवांछित विकल्प हो सकता है। आपके DBMS के आधार पर, इसे मौजूदा कुंजी को छोड़ने और इसे फिर से बनाने की भी आवश्यकता हो सकती है।
किसी भी मामले में, यह त्रुटि एक अच्छी बात है, क्योंकि यह हमें उस समस्या के प्रति सचेत करती है जो इस पंक्ति को हटाने पर हमारे पास होगी। यह संदर्भात्मक अखंडता को लागू करने में मदद करता है।
सावधानी! WHERE को भूल रहे हैं खंड
DELETE बयान बहुत खतरनाक बयान हो सकता है। अगर आप WHERE . को छोड़ देते हैं खंड, आप सभी को हटा देंगे तालिका में पंक्तियाँ।
सौभाग्य से, यदि आप किसी रिश्ते की मूल तालिका से डेटा हटाने का प्रयास करते हैं, तो आप विदेशी कुंजी बाधाओं से बच सकते हैं।
लेकिन क्या होगा अगर ऐसा नहीं है। क्या होगा यदि आपके डिलीट स्टेटमेंट से कोई त्रुटि नहीं होती है?
चलो पता करते हैं!
चलिए एक और DELETE चलाते हैं कथन, लेकिन इस बार हम WHERE . शामिल करना भूल जाएंगे खंड। साथ ही, इस बार हम इसे उस तालिका के विरुद्ध चलाएंगे जो किसी रिश्ते में माता-पिता नहीं है।
सबसे पहले, आइए देखें कि तालिका में क्या है।
SELECT * FROM Pets; परिणाम:
+---------+-------------+-----------+-----------+------------+ | PetId | PetTypeId | OwnerId | PetName | DOB | |---------+-------------+-----------+-----------+------------| | 1 | 2 | 3 | Fluffy | 2020-11-20 | | 2 | 3 | 3 | Fetch | 2019-08-16 | | 3 | 2 | 2 | Scratch | 2018-10-01 | | 4 | 3 | 3 | Wag | 2020-03-15 | | 5 | 1 | 1 | Tweet | 2020-11-28 | | 6 | 3 | 4 | Fluffy | 2020-09-17 | | 7 | 3 | 2 | Bark | NULL | | 8 | 2 | 4 | Meow | NULL | +---------+-------------+-----------+-----------+------------+
ठीक है, तो हमारे पास आठ पालतू जानवर हैं। हम वास्तव में देख सकते हैं कि तीन पालतू जानवर मालिक संख्या 3 के स्वामित्व में हैं - मालिक जिसे हमने पिछले उदाहरण में हटाने का प्रयास किया था। यही कारण है कि हमें त्रुटि मिली।
फिर भी, चलिए आगे बढ़ते हैं और अपना DELETE चलाते हैं WHERE . के बिना स्टेटमेंट खंड, फिर तालिका को फिर से जांचें
DELETE FROM Pets;
SELECT * FROM Pets; परिणाम:
(8 rows affected) (0 rows affected)
(8 rows affected) भाग का अर्थ है कि आठ पंक्तियों को हटा दिया गया था।
(0 rows affected) भाग का अर्थ है कि कोई पंक्तियाँ नहीं चुनी गईं (क्योंकि तालिका में कोई पंक्तियाँ नहीं हैं।
ओह!
कई बार ऐसा भी हो सकता है कि आपको वास्तव में तालिका की सभी पंक्तियों को हटाना पड़े। तालिका के आकार के आधार पर, यह कथन आपके लिए आवश्यक होगा।
यदि आपको एक बड़ी तालिका को हटाना है, तो TRUNCATE TABLE . भी है , जो किसी तालिका या तालिका के निर्दिष्ट विभाजन से सभी पंक्तियों को हटा देता है, व्यक्तिगत पंक्ति विलोपन को लॉग किए बिना (DELETE स्टेटमेंट इन विलोपन को लॉग करता है)।
इसलिए, TRUNCATE TABLE तेज़ है और कम सिस्टम और लेन-देन लॉग संसाधनों का उपयोग करता है।
TRUNCATE TABLE . का उपयोग करने का उदाहरण :
TRUNCATE TABLE Owners;
ध्यान दें कि यदि तालिका को किसी विदेशी कुंजी बाधा द्वारा संदर्भित किया जा रहा है, तो यह काम नहीं कर सकता है, भले ही कोई चाइल्ड रो न हो। ऐसे मामलों में, DELETE इसके बजाय काम कर सकता है।