रिलेशनल डेटाबेस में, हम डेटा को विभिन्न फॉर्मेट में स्टोर करने के लिए टेबल बनाते हैं। SQL सर्वर डेटा को एक पंक्ति और कॉलम प्रारूप में संग्रहीत करता है जिसमें प्रत्येक डेटा प्रकार से जुड़ा एक मान होता है। जब हम SQL टेबल डिज़ाइन करते हैं, तो हम डेटा प्रकार जैसे पूर्णांक, फ्लोट, दशमलव, वर्चर और बिट को परिभाषित करते हैं। उदाहरण के लिए, ग्राहक डेटा संग्रहीत करने वाली तालिका में ग्राहक का नाम, ईमेल, पता, राज्य, देश आदि जैसे फ़ील्ड हो सकते हैं। SQL टेबल पर विभिन्न SQL कमांड निष्पादित किए जाते हैं और इन्हें निम्नलिखित श्रेणियों में विभाजित किया जा सकता है:
- डेटा परिभाषा भाषा (डीडीएल): इन कमांड का उपयोग डेटाबेस में डेटाबेस ऑब्जेक्ट बनाने और संशोधित करने के लिए किया जाता है।
- बनाएं: ऑब्जेक्ट बनाता है
- बदलें: वस्तुओं को संशोधित करता है
- छोड़ें: वस्तुओं को हटाता है
- छोटा करें: तालिका से सभी डेटा हटाता है
- डेटा हेरफेर भाषा (डीएमएल): ये कमांड डेटाबेस में डेटा को सम्मिलित करते हैं, पुनः प्राप्त करते हैं, संशोधित करते हैं, हटाते हैं और अपडेट करते हैं।
- चुनें: एकल या एकाधिक तालिका से डेटा पुनर्प्राप्त करता है
- सम्मिलित करें: तालिका में नया डेटा जोड़ता है
- अपडेट करें: मौजूदा डेटा को संशोधित करता है
- हटाएं: तालिका में मौजूदा रिकॉर्ड हटाता है
- डेटा नियंत्रण भाषा (डीसीएल): ये कमांड डेटाबेस में अधिकार या अनुमति नियंत्रण से जुड़े होते हैं।
- अनुदान: उपयोगकर्ता को अनुमतियां असाइन करता है
- निरस्त करें: उपयोगकर्ता से अनुमतियां निरस्त करता है
- लेन-देन नियंत्रण भाषा (TCL): ये कमांड डेटाबेस में लेनदेन को नियंत्रित करते हैं।
- प्रतिबद्ध: क्वेरी द्वारा किए गए परिवर्तनों को सहेजता है
- रोलबैक: लेन-देन की शुरुआत में या लेन-देन के अंदर एक बचत बिंदु पर एक स्पष्ट या निहित लेनदेन को वापस रोल करता है
- लेनदेन सहेजें: लेन-देन के भीतर एक बचत बिंदु या मार्कर सेट करता है
मान लीजिए कि आपके पास SQL तालिका में ग्राहक ऑर्डर डेटा संग्रहीत है। यदि आप लगातार इस तालिका में डेटा सम्मिलित करते रहते हैं, तो तालिका में लाखों रिकॉर्ड हो सकते हैं, जो आपके अनुप्रयोगों में प्रदर्शन समस्याओं का कारण बन सकते हैं। आपका सूचकांक रखरखाव भी अत्यधिक समय लेने वाला हो सकता है। अक्सर, आपको तीन वर्ष से अधिक पुराने आदेशों को बनाए रखने की आवश्यकता नहीं होती है। इन उदाहरणों में, आप उन अभिलेखों को तालिका से हटा सकते हैं। यह भंडारण स्थान को बचाएगा, साथ ही आपके रखरखाव के प्रयासों को कम करेगा।
आप SQL तालिका से डेटा को दो तरीकों से हटा सकते हैं:
- SQL डिलीट स्टेटमेंट का उपयोग करना
- छंटनी का उपयोग करना
हम इन SQL कमांड के बीच के अंतर को बाद में देखेंगे। आइए पहले SQL डिलीट स्टेटमेंट को एक्सप्लोर करें।
बिना किसी शर्त के SQL डिलीट स्टेटमेंट
डेटा मैनिपुलेशन लैंग्वेज (डीएमएल) स्टेटमेंट में, एक SQL डिलीट स्टेटमेंट एक टेबल से पंक्तियों को हटा देता है। आप एक विशिष्ट पंक्ति या सभी पंक्तियों को हटा सकते हैं। एक मूल डिलीट स्टेटमेंट के लिए किसी तर्क की आवश्यकता नहीं होती है।
आइए नीचे दी गई स्क्रिप्ट का उपयोग करके ऑर्डर SQL तालिका बनाएं। इस तालिका में तीन कॉलम [ऑर्डर आईडी], [उत्पाद नाम] और [उत्पाद मात्रा] हैं।
Create Table Orders
( OrderID int,
ProductName varchar(50),
ProductQuantity int
)
इस तालिका में कुछ रिकॉर्ड डालें।
Insert into Orders values (1,'ABC books',10),
(2,'XYZ',100),
(3,'SQL book',50)
अब, मान लीजिए कि हम टेबल डेटा को हटाना चाहते हैं। आप डिलीट स्टेटमेंट का उपयोग करके डेटा को हटाने के लिए टेबल का नाम निर्दिष्ट कर सकते हैं। दोनों SQL कथन समान हैं। हम (वैकल्पिक) कीवर्ड से तालिका का नाम निर्दिष्ट कर सकते हैं या हटाए जाने के बाद सीधे तालिका का नाम निर्दिष्ट कर सकते हैं।
Delete Orders
Go
Delete from Orders
GO
फ़िल्टर किए गए डेटा के साथ SQL डिलीट स्टेटमेंट
ये SQL डिलीट स्टेटमेंट टेबल के सभी डेटा को डिलीट कर देते हैं। आमतौर पर, हम SQL तालिका से सभी पंक्तियों को नहीं हटाते हैं। एक विशिष्ट पंक्ति को हटाने के लिए, हम डिलीट स्टेटमेंट के साथ एक क्लॉज जोड़ सकते हैं। जहां क्लॉज में फ़िल्टर मानदंड होते हैं और अंततः यह निर्धारित करते हैं कि कौन सी पंक्ति (पंक्तियों) को हटाना है।
उदाहरण के लिए, मान लें कि हम ऑर्डर आईडी 1 को हटाना चाहते हैं। एक बार जब हम एक क्लॉज जोड़ते हैं, तो SQL सर्वर पहले संबंधित पंक्तियों की जांच करता है और उन विशिष्ट पंक्तियों को हटा देता है।Delete Orders where orderid=1
यदि जहां क्लॉज की स्थिति गलत है, तो यह किसी भी पंक्ति को नहीं हटाता है। उदाहरण के लिए, हमने ऑर्डर टेबल से ऑर्डर किया गया 1 हटा दिया है। यदि हम कथन को फिर से निष्पादित करते हैं, तो उसे कोई भी पंक्तियाँ नहीं मिलती हैं जहाँ क्लॉज़ की स्थिति को संतुष्ट किया जा सके। इस मामले में, यह प्रभावित 0 पंक्तियों को लौटाता है।
एसक्यूएल डिलीट स्टेटमेंट और टॉप क्लॉज
आप पंक्तियों को हटाने के लिए भी TOP स्टेटमेंट का उपयोग कर सकते हैं। उदाहरण के लिए, नीचे दी गई क्वेरी ऑर्डर तालिका से शीर्ष 100 पंक्तियों को हटा देती है।
Delete top (100) [OrderID]
from Orders
चूंकि हमने कोई 'ORDER BY' निर्दिष्ट नहीं किया है, यह यादृच्छिक पंक्तियों को चुनता है और उन्हें हटा देता है। हम डेटा को सॉर्ट करने और शीर्ष पंक्तियों को हटाने के लिए ऑर्डर बाय क्लॉज का उपयोग कर सकते हैं। नीचे दी गई क्वेरी में, यह [ऑर्डर आईडी] को अवरोही क्रम में सॉर्ट करता है, और फिर इसे [ऑर्डर] तालिका से हटा देता है।
Delete from Orders where [OrderID] In
(
Select top 100 [OrderID] FROM Orders
order by [OrderID] Desc
)
किसी अन्य तालिका के आधार पर पंक्तियों को हटाना
कभी-कभी हमें किसी अन्य तालिका के आधार पर पंक्तियों को हटाने की आवश्यकता होती है। यह तालिका एक ही डेटाबेस में मौजूद हो सकती है या नहीं।
- टेबल लुकअप
हम इन पंक्तियों को हटाने के लिए टेबल लुकअप विधि या एसक्यूएल जॉइन का उपयोग कर सकते हैं। उदाहरण के लिए, हम [आदेश] तालिका से उन पंक्तियों को हटाना चाहते हैं जो निम्नलिखित शर्तों को पूरा करती हैं:
[dbo].[ग्राहक] तालिका में इसकी संगत पंक्तियाँ होनी चाहिए।
नीचे दी गई क्वेरी को देखें, यहां हमारे पास डिलीट स्टेटमेंट के जहां क्लॉज में एक सेलेक्ट स्टेटमेंट है। SQL सर्वर पहले उन पंक्तियों को प्राप्त करता है जो चयन कथन को संतुष्ट करती हैं और फिर SQL डिलीट स्टेटमेंट का उपयोग करके उन पंक्तियों को [ऑर्डर] तालिका से हटा देती हैं।
Delete Orders where orderid in
(Select orderid
from Customer)
- एसक्यूएल जॉइन करें
वैकल्पिक रूप से, हम इन तालिकाओं के बीच SQL जॉइन का उपयोग कर सकते हैं और पंक्तियों को हटा सकते हैं। नीचे दी गई क्वेरी में, हम [ग्राहक] तालिका के साथ टेबल [ऑर्डर]] में शामिल होते हैं। SQL जॉइन हमेशा टेबल के बीच एक कॉमन कॉलम पर काम करता है। हमारे पास एक कॉलम [ऑर्डरआईडी] है जो दोनों टेबल को एक साथ जोड़ता है।
DELETE Orders
FROM Orders o
INNER JOIN Customer c ON o.orderid=c.orderid
उपरोक्त डिलीट स्टेटमेंट को समझने के लिए, वास्तविक निष्पादन योजना देखें।
निष्पादन योजना के अनुसार, यह दोनों तालिकाओं पर एक टेबल स्कैन करता है, मिलान डेटा प्राप्त करता है और उन्हें ऑर्डर तालिका से हटा देता है।
- सामान्य तालिका अभिव्यक्ति (सीटीई)
SQL तालिका से पंक्तियों को हटाने के लिए भी हम एक सामान्य तालिका अभिव्यक्ति (CTE) का उपयोग कर सकते हैं। सबसे पहले, हम उस पंक्ति को खोजने के लिए एक सीटीई परिभाषित करते हैं जिसे हम हटाना चाहते हैं।
फिर, हम SQL टेबल ऑर्डर के साथ सीटीई में शामिल हो जाते हैं और पंक्तियों को हटा देते हैं।
WITH cteOrders AS
(SELECT OrderID
FROM Customer
WHERE CustomerID = 1 )
DELETE Orders
FROM cteOrders sp
INNER JOIN dbo.Orders o ON o.orderid = sp.orderid;
पहचान सीमा पर प्रभाव
SQL सर्वर में पहचान कॉलम आपके कॉलम के लिए अद्वितीय, अनुक्रमिक मान उत्पन्न करते हैं। उनका उपयोग मुख्य रूप से SQL तालिका में एक पंक्ति को विशिष्ट रूप से पहचानने के लिए किया जाता है। SQL सर्वर में संकुल अनुक्रमणिका के लिए प्राथमिक कुंजी स्तंभ भी एक अच्छा विकल्प है।
नीचे दी गई लिपि में, हमारे पास एक [कर्मचारी] तालिका है। इस तालिका में एक पहचान कॉलम आईडी है।
Create Table Employee
(
id int identity(1,1),
[Name] varchar(50)
)
हमने इस तालिका में 50 रिकॉर्ड डाले हैं जो आईडी कॉलम के लिए पहचान मान उत्पन्न करते हैं।
Declare @id int=1
While(@id<=50)
BEGIN
Insert into Employee([Name]) values('Test'+CONVERT(VARCHAR,@ID))
Set @id=@id+1
END
यदि हम SQL तालिका से कुछ पंक्तियों को हटाते हैं, तो यह बाद के मानों के लिए पहचान मानों को रीसेट नहीं करता है। उदाहरण के लिए, आइए कुछ पंक्तियों को हटा दें जिनका पहचान मान 20 से 25 तक है।
Delete from employee
where id between 20 and 25
अब, तालिका रिकॉर्ड देखें।
Select * from employee where id>15
यह पहचान मूल्य सीमा में अंतर दिखाता है।
SQL डिलीट स्टेटमेंट और ट्रांजेक्शन लॉग
लेन-देन लॉग में प्रत्येक पंक्ति विलोपन को SQL डिलीट लॉग करता है। मान लीजिए कि आपको SQL तालिका से लाखों रिकॉर्ड हटाने की आवश्यकता है। आप एक लेन-देन में बड़ी संख्या में रिकॉर्ड्स को हटाना नहीं चाहते हैं क्योंकि इससे आपकी लॉग फ़ाइल तेजी से बढ़ सकती है और आपका डेटाबेस भी अनुपलब्ध हो सकता है। अगर आप बीच में कोई लेन-देन रद्द करते हैं, तो डिलीट स्टेटमेंट को रोलबैक करने में घंटों लग सकते हैं।
इस मामले में, आपको हमेशा छोटे टुकड़ों में पंक्तियों को हटाना चाहिए और उन हिस्सों को नियमित रूप से करना चाहिए। उदाहरण के लिए, आप एक बार में 10,000 पंक्तियों के एक बैच को हटा सकते हैं, इसे प्रतिबद्ध कर सकते हैं और अगले बैच में जा सकते हैं। जब SQL सर्वर चंक करता है, तो लेन-देन लॉग वृद्धि को नियंत्रित किया जा सकता है।
सर्वोत्तम प्रक्रियाएं
- डेटा हटाने से पहले आपको हमेशा बैकअप करना चाहिए।
- डिफ़ॉल्ट रूप से, SQL सर्वर निहित लेनदेन का उपयोग करता है और उपयोगकर्ता से पूछे बिना रिकॉर्ड करता है। सर्वोत्तम अभ्यास के रूप में, आपको आरंभिक लेनदेन का उपयोग करके एक स्पष्ट लेनदेन शुरू करना चाहिए। यह आपको लेनदेन करने या रोलबैक करने का नियंत्रण देता है। यदि आपका डेटाबेस पूर्ण पुनर्प्राप्ति मोड में है, तो आपको बार-बार लेन-देन लॉग बैकअप चलाना चाहिए।
- आप अत्यधिक लेन-देन लॉग उपयोग से बचने के लिए डेटा को छोटे टुकड़ों में हटाना चाहते हैं। यह अन्य SQL लेनदेन के लिए भी अवरोधों से बचाती है।
- आपको अनुमतियों को प्रतिबंधित करना चाहिए ताकि उपयोगकर्ता डेटा हटा न सकें। SQL तालिका से डेटा निकालने के लिए केवल अधिकृत उपयोगकर्ताओं के पास ही पहुंच होनी चाहिए।
- आप डिलीट स्टेटमेंट को व्हेयर क्लॉज के साथ चलाना चाहते हैं। यह SQL तालिका से फ़िल्टर किए गए डेटा को हटा देता है। यदि आपके एप्लिकेशन को बार-बार डेटा हटाने की आवश्यकता होती है, तो समय-समय पर पहचान मूल्यों को रीसेट करना एक अच्छा विचार है। अन्यथा, आपको पहचान मूल्य के समाप्त होने की समस्या का सामना करना पड़ सकता है।
- यदि आप टेबल को खाली करना चाहते हैं, तो यह सलाह दी जाती है कि ट्रंकेट स्टेटमेंट का उपयोग करें। ट्रंकेट स्टेटमेंट टेबल से सभी डेटा को हटा देता है, न्यूनतम ट्रांजेक्शन लॉगिंग का उपयोग करता है, आइडेंटिटी वैल्यू रेंज को रीसेट करता है, और एसक्यूएल डिलीट स्टेटमेंट की तुलना में तेज़ है क्योंकि यह टेबल के सभी पेजों को तुरंत हटा देता है।
- यदि आप अपनी तालिकाओं के लिए विदेशी कुंजी बाधाओं (अभिभावक-बाल संबंध) का उपयोग करते हैं, तो आपको पंक्ति को चाइल्ड पंक्ति से और फिर मूल तालिका से हटा देना चाहिए। यदि आप पैरेंट पंक्ति से पंक्ति को हटाते हैं, तो आप चाइल्ड टेबल से पंक्ति को स्वचालित रूप से हटाने के लिए कैस्केड ऑन डिलीट विकल्प का भी उपयोग कर सकते हैं। आप इस लेख का संदर्भ ले सकते हैं:अधिक जानकारी के लिए कैस्केड हटाएं और SQL सर्वर विदेशी कुंजी में कैस्केड अपडेट करें।
- यदि आप पंक्तियों को हटाने के लिए शीर्ष कथन का उपयोग करते हैं, तो SQL सर्वर पंक्तियों को बेतरतीब ढंग से हटा देता है। आपको हमेशा टॉप क्लॉज का इस्तेमाल इसी ऑर्डर बाय और ग्रुप बाय क्लॉज के साथ करना चाहिए।
- एक डिलीट स्टेटमेंट संदर्भ तालिका पर एक विशेष इंटेंट लॉक प्राप्त करता है; इसलिए, उस समय के दौरान, कोई अन्य लेनदेन डेटा को संशोधित नहीं कर सकता है। आप डेटा को पढ़ने के लिए NOLOCK संकेत का उपयोग कर सकते हैं।
- आपको SQL डिलीट स्टेटमेंट के डिफ़ॉल्ट लॉकिंग व्यवहार को ओवरराइड करने के लिए टेबल हिंट का उपयोग करने से बचना चाहिए; इसका उपयोग केवल अनुभवी डीबीए और डेवलपर्स द्वारा किया जाना चाहिए।
महत्वपूर्ण विचार
SQL तालिका से डेटा निकालने के लिए SQL डिलीट स्टेटमेंट का उपयोग करने के कई लाभ हैं, लेकिन जैसा कि आप देख सकते हैं, इसके लिए एक व्यवस्थित दृष्टिकोण की आवश्यकता है। छोटे बैचों में डेटा को हमेशा हटाना और उत्पादन इंस्टेंस से डेटा हटाते समय सावधानी के साथ आगे बढ़ना महत्वपूर्ण है। डाउनटाइम या भविष्य के प्रदर्शन प्रभावों से बचने के लिए न्यूनतम समय में डेटा पुनर्प्राप्त करने के लिए एक बैकअप रणनीति का होना आवश्यक है।