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

SQL सर्वर DELETE - थोड़े उन्नत परिदृश्य वाली तालिका से एक या अधिक पंक्तियों को हटाना

वर्तमान लेख तालिका से एक या अधिक रिकॉर्ड (पंक्तियों) को हटाने के लिए DELETE कथन के थोड़े उन्नत उपयोग पर केंद्रित है। हालांकि यह ज्यादातर शुरुआती लोगों को लक्षित करता है, लेकिन इसकी युक्तियां सभी डेटाबेस विशेषज्ञों के लिए मददगार हो सकती हैं।

आवश्यकताएं:DELETE कथन मूल परिदृश्य

यदि आप पहले से ही डिलीट स्टेटमेंट के मूल उपयोगों से परिचित नहीं हैं, तो हम आपको पिछले लेख SQL सर्वर DELETE - एक टेबल से एक या अधिक पंक्तियों को हटाने की समीक्षा करने की सलाह देंगे। वह लेख निम्नलिखित पहलुओं पर केंद्रित है:

  1. नमूना डेटाबेस सेट करना।
  2. नमूना डेटाबेस के विरुद्ध SQL स्क्रिप्ट चलाना।
  3. नमूना डेटाबेस में तालिका बनाना और उसमें डेटा सम्मिलित करना।
  4. तालिका से सभी पंक्तियों को हटाना।
  5. किसी शर्त के आधार पर तालिका से एक या अधिक पंक्तियों को हटाना।
  6. एक से अधिक शर्तों के आधार पर किसी तालिका से एक या अधिक पंक्तियों को हटाना।

डिलीट स्टेटमेंट के थोड़े उन्नत उपयोग पर जाने से पहले इन डेटा को समझना महत्वपूर्ण है, इसलिए, यदि आपके पास अभी तक आवश्यक पृष्ठभूमि नहीं है, तो उस लेख की समीक्षा करें।

DELETE कथन के लिए थोड़ा उन्नत परिदृश्य

किसी भी अन्य पूर्वाभ्यास की तरह, हमें अपनी स्क्रिप्ट को सुरक्षित रूप से चलाने के परीक्षण के लिए पहले एक नमूना डेटाबेस स्थापित करना होगा।

नमूना डेटाबेस सेटअप के बारे में एक युक्ति

मैं आपकी मशीन पर पहले स्थानीय रूप से SQL सर्वर डेवलपर संस्करण स्थापित करने की अत्यधिक अनुशंसा करता हूं। यह सीखने और परीक्षण के उद्देश्यों के लिए बेहतर है।

SQL सर्वर डेवलपर संस्करण डाउनलोड करें

नमूना डेटाबेस सेट करें (WatchesDelSample)

हम WatchesDelSample नामक एक डेटाबेस स्थापित करने जा रहे हैं। इस डेटाबेस में निम्नलिखित तीन टेबल हैं:

  1. देखो।
  2. रंग.
  3. घड़ी प्रकार।

वॉच टेबल मुख्य है। इसमें घड़ी का नाम, रंग और प्रकार शामिल है। प्रकार और रंग दोनों के बारे में जानकारी दो संदर्भ तालिकाओं से आती है रंग और घड़ी प्रकार विदेशी कुंजियों के माध्यम से जुड़ा हुआ है।

निम्न स्क्रिप्ट के साथ नमूना डेटाबेस सेटअप करें:

-- Create sample database WatchesDelSample
USE MASTER
GO

CREATE DATABASE WatchesDelSample
GO

USE WatchesDelSample

-- Creating a reference table WatchType
CREATE TABLE dbo.WatchType
(
	WatchTypeId INT IDENTITY(1,1),
	Name VARCHAR(50)NOT NULL,
	Detail VARCHAR(200)NULL 
	CONSTRAINT PK_WatchType_WatchTypeId PRIMARY KEY (WatchTypeId)
)
GO

-- Populating (adding rows to the) table WatchType
SET IDENTITY_INSERT dbo.WatchType ON
GO
INSERT INTO dbo.WatchType
(
  WatchTypeId
 ,Name
 ,Detail
)
VALUES
(
  1  -- ID - INT Primary Key
 ,'Analogue' -- Name - varchar(50) NOT NULL
 ,'This is Analogue' -- Detail - varchar(200)
),
(
  2  -- ID - INT Primary Key
 ,'Digital' -- Name - varchar(50) NOT NULL
 ,'This is Digital' -- Detail - varchar(200)
),
(
  3  -- ID - INT Primary Key
 ,'Sports' -- Name - varchar(50) NOT NULL
 ,'This is Sports' -- Detail - varchar(200)
);
GO
SET IDENTITY_INSERT dbo.WatchType OFF
GO

-- Creating a reference table Color
CREATE TABLE dbo.Color
(
	ColorId INT IDENTITY(1,1),
	Name VARCHAR(50)NOT NULL,
	Detail VARCHAR(200)NULL 
	CONSTRAINT PK_Color_ColorId PRIMARY KEY (ColorId)
)
GO

-- Populating (adding rows to the) table Color
SET IDENTITY_INSERT dbo.Color ON
GO
INSERT INTO dbo.Color
(
  ColorId
 ,Name
 ,Detail
)
VALUES
(
  1  -- ID - INT Primary Key
 ,'Black' -- Name - varchar(50) NOT NULL
 ,'This is Black' -- Detail - varchar(200)
),
(
  2  -- ID - INT Primary Key
 ,'White' -- Name - varchar(50) NOT NULL
 ,'This is White' -- Detail - varchar(200)
),
(
  3  -- ID - INT Primary Key
 ,'Blue' -- Name - varchar(50) NOT NULL
 ,'This is Blue' -- Detail - varchar(200)
);
GO
SET IDENTITY_INSERT dbo.Color OFF
GO

-- Creating a table Watch
CREATE TABLE dbo.Watch
(
	WatchId INT IDENTITY(1,1),
	Name VARCHAR(50),
	WatchTypeId INT,
	ColorId INT,
	Price DECIMAL(5,2),		
	CONSTRAINT PK_Watch_WatchId PRIMARY KEY (WatchId)
)
GO

-- Creating foreign key constraint on Watch table to get WatchTypeId values from WatchType table
ALTER TABLE dbo.Watch
    ADD CONSTRAINT [FK_Watch_WatchType_WatchTypeId] 
FOREIGN KEY ([WatchTypeId]) REFERENCES dbo.[WatchType] ([WatchTypeId]);

-- Creating foreign key constraint on Watch table to get ColorId values from Color table
ALTER TABLE dbo.Watch
    ADD CONSTRAINT [FK_Watch_Color_ColorId] 
FOREIGN KEY ([ColorId]) REFERENCES dbo.[Color] ([ColorId]);


-- Populating (adding rows to the) table Watch getting some columns values from reference tables
SET IDENTITY_INSERT WatchesDelSample.dbo.Watch ON
GO
INSERT WatchesDelSample.dbo.Watch(WatchId, Name, WatchTypeId, ColorId, Price) VALUES (1, 'Casio', 1, 1, 100.00)
INSERT WatchesDelSample.dbo.Watch(WatchId, Name, WatchTypeId, ColorId, Price) VALUES (2, 'Timex', 2, 2, 70.00)
GO
SET IDENTITY_INSERT WatchesDelSample.dbo.Watch OFF
GO

त्वरित डेटा जांच

आइए हम देखें . की सभी पंक्तियों को देखें टेबल। उसके लिए, निम्न स्क्रिप्ट चलाएँ:

-- View the watch table data (rows)
SELECT w.WatchId
      ,w.Name
      ,w.WatchTypeId
      ,w.ColorId
      ,w.Price FROM dbo.Watch w

आउटपुट इस प्रकार है:

ध्यान दें कि मैं इस डेमो के लिए SQL सर्वर के लिए dbForge Studio का उपयोग कर रहा हूं। हालाँकि, आप समान स्क्रिप्ट चलाने के लिए SQL सर्वर प्रबंधन स्टूडियो (SSMS) का उपयोग कर सकते हैं - परिणाम समान होंगे।

प्रकार और रंग कॉलम के पीछे की आईडी (कोड) को समझना

जैसा कि आप देख सकते हैं, वॉच टेबल के निम्नलिखित कॉलम के अंतर्गत कुछ आईडी हैं:

  1. WatchTypeId
  2. कलर आईडी

इन स्तंभों को उन संदर्भ तालिकाओं से मान मिलते हैं जहां उन्हें मूल रूप से परिभाषित किया गया है। वॉच टेबल विदेशी कुंजी बाधाओं के माध्यम से उन संदर्भ तालिकाओं से जुड़ती है।

उपरोक्त आउटपुट के साथ तीन समस्याएं होती हैं:

  1. हम WatchTypeId और ColorId देख सकते हैं लेकिन समझ नहीं पाते कि वे क्या हैं।
  2. अगर हम समझते हैं कि इन आईडी का क्या मतलब है, तो हमें हर समय उनकी मूल तालिका में जाकर जांचना होगा।
  3. सबसे महत्वपूर्ण बात, हमें अन्य तालिकाओं से रंग और प्रकार प्राप्त करने की आवश्यकता क्यों है?

एक कारण है कि हमने अन्य तालिकाओं में Color (ColorId) और Type (WatchTypeId) को परिभाषित किया है। हमें यह सुनिश्चित करने की आवश्यकता है कि ये मान सुसंगत रहें।

यदि हम मूल रूप से संदर्भ तालिकाओं में मान को परिभाषित नहीं करते हैं, तो हम रंग या प्रकार का प्रतिनिधित्व करने के लिए शब्दों को मिश्रित कर सकते थे। उदाहरण के लिए, दोनों नीला . हो सकते हैं और ब्लूज़ , या एनालॉग और एनालॉग . ऐसी समस्या से बचने के लिए, हम संदर्भ तालिकाओं में रंगों और प्रकारों का मानकीकरण करते हैं। फिर हम उनके कोड को मुख्य टेबल पर भेजते हैं।

वॉच टेबल को अन्य संदर्भ तालिकाओं के साथ जोड़कर, हम इन कोडों के पीछे के मूल्यों को पुनः प्राप्त कर सकते हैं। डेटाबेस विकास में यह एक आम बात है।

आईडी के पीछे प्रकार और रंग मानों के साथ वॉच टेबल देखना

हम निम्नलिखित स्क्रिप्ट को क्रियान्वित करके रंग और प्रकार के पीछे के कोड का वास्तविक अर्थ देख सकते हैं:

-- View the watch table data (rows)
SELECT w.WatchId
      ,w.Name
      ,wt.Name AS WatchType
      ,c.Name AS ColorName
      ,w.Price FROM dbo.Watch w
  INNER JOIN dbo.Color c ON c.ColorId=w.ColorId
  INNER JOIN dbo.WatchType wt ON w.WatchTypeId = wt.WatchTypeId

परिणाम इस प्रकार है:

डेटाबेस आर्किटेक्चर को समझना

हमें इस डेटाबेस के आर्किटेक्चर के बारे में अधिक जानकारी चाहिए। हमारा ध्यान इस बात पर है कि टेबल एक दूसरे से कैसे जुड़ते हैं।

उपरोक्त छवि संदर्भ तालिका के परिदृश्य को दर्शाती है जिससे मुख्य तालिका को सुसंगत डेटा प्राप्त करने में मदद मिलती है। यह विशेष रूप से शुरुआती लोगों के लिए एक साधारण परिदृश्य नहीं है, हालांकि यह कई डेटाबेस में आम है।

हम इस वास्तुकला का अध्ययन कर रहे हैं क्योंकि हमें यह समझने की आवश्यकता है कि उपरोक्त तालिकाओं में से किसी एक या अधिक पंक्तियों को कैसे हटाया जाए, जब वे इस तरह से जुड़ी हों।

संदर्भ (रंग) तालिका से एक पंक्ति हटाना

क्या हम संदर्भ तालिका से एक पंक्ति हटा सकते हैं या नहीं? आइए इसका उत्तर ढूंढते हैं।

हम रंग तालिका से पहली पंक्ति को हटाते हैं:

-- Deleting one row with color id 1 from the reference table color 
DELETE FROM Color
WHERE ColorId = 1

परिणाम इस प्रकार है:

त्रुटि का अर्थ है कि उस पंक्ति को हटाने की अनुमति नहीं है जिसे हम चाहते थे।

दूसरे शब्दों में, हम किसी अन्य तालिका द्वारा संदर्भित तालिका से एक पंक्ति को नहीं हटा सकते हैं।

लिंक की गई पंक्तियाँ बनाम अनलिंक की गई पंक्तियाँ

आइए संदर्भ तालिका की पंक्तियों को निम्नलिखित दो श्रेणियों में विभाजित करें:

  1. लिंक की गई पंक्तियाँ।
  2. अनलिंक की गई पंक्तियाँ।

एक लिंक की गई पंक्ति एक संदर्भ तालिका की एक पंक्ति है जिसका उपयोग किसी अन्य तालिका द्वारा किया जाता है। एक अनलिंक की गई पंक्ति एक संदर्भ तालिका की एक पंक्ति है जिसे कोई अन्य तालिका पसंद नहीं करती है।

हम किसी संदर्भ तालिका की अनलिंक की गई पंक्तियों (रिकॉर्ड्स) को तुरंत हटा सकते हैं।

रंग तालिका से एक पंक्ति को हटाने का हमारा पहला प्रयास विफल रहा क्योंकि वह ColorId (1) मुख्य वॉच टेबल के उपयोग में था।

संदर्भ तालिका (रंग) देखें

आइए हम संदर्भ तालिका को इस प्रकार देखें:

-- View reference table Color
SELECT c.ColorId
      ,c.Name
      ,c.Detail FROM dbo.Color c

परिणाम सेट नीचे है:

पिछले आउटपुट से, हम जानते हैं कि रंग नीला (ColorId:3) वॉच टेबल द्वारा उपयोग में नहीं है क्योंकि अभी तक टेबल में कोई ब्लू वॉच स्टोर नहीं हुई है।

संदर्भ (रंग) तालिका से एक अनलिंक की गई पंक्ति को हटाना

निम्न स्क्रिप्ट निष्पादित करें:

-- Deleting unlinked row with color id 3 from reference table Color
DELETE FROM Color
WHERE ColorId = 3 -- blue color

हमने पंक्ति को सफलतापूर्वक हटा दिया है, और हम तालिका देखकर इसकी पुष्टि कर सकते हैं:

--View reference table Color after deleting the unlinked row
SELECT c.ColorId
      ,c.Name
      ,c.Detail FROM dbo.Color c

परिणाम सेट नीचे है:

यह दर्शाता है कि नीला . वाली पंक्ति तालिका से रंग सफलतापूर्वक हटा दिया गया है।

संदर्भ तालिका से डेटा हटाने के बारे में एक युक्ति

याद रखें कि आप किसी संदर्भ तालिका से किसी रिकॉर्ड (पंक्ति) को हटा नहीं सकते हैं यदि वह किसी अन्य तालिका या तालिकाओं के समूह के उपयोग में है। हालांकि, आप उसी (संदर्भ) तालिका से रिकॉर्ड हटा सकते हैं यदि वह उपयोग में नहीं है।

संदर्भ (रंग) तालिका से एक लिंक की गई पंक्ति को हटाना

क्या होगा यदि हम एक संदर्भ तालिका से एक पंक्ति को हटाना चाहते हैं, यह जानते हुए कि यह संदर्भ डेटा जैसे रंग को किसी अन्य तालिका में पास करती है? दूसरे शब्दों में, हम संदर्भ तालिका से एक लिंक की गई पंक्ति को कैसे हटाते हैं?

सबसे पहले, हमें उस पंक्ति को मुख्य तालिका से हटाना होगा जहां इसका संदर्भ दिया गया है।

उदाहरण के लिए, हम सफ़ेद रंग को हटा सकते हैं रंग तालिका से इस प्रकार है:

  1. मुख्य तालिका से सभी पंक्तियां हटाएं (देखें) जहां रंग सफेद है (आईडी के आधार पर)।
  2. संदर्भ रंग तालिका से पंक्ति हटाएं जहां रंग सफेद है (आईडी के आधार पर)।

अब, आइए इसे व्यवहार में देखें।

मुख्य (देखें) तालिका से उन सभी पंक्तियों को हटाना जहां रंग सफेद है

हमारा लक्ष्य सफेद . के निशान हटाना है संदर्भ और मुख्य तालिकाओं दोनों से रंग।

आइए डेटा को हटाने से पहले एक नज़र डालते हैं। हम जांचना चाहते हैं कि मुख्य तालिका से कितनी पंक्तियों में रंग आईडी 2 (सफेद) है:

-- View Watch table before deleting rows with white color (color id:2)
 SELECT w.WatchId
       ,w.Name
       ,w.WatchTypeId
       ,w.ColorId
       ,w.Price FROM dbo.Watch w
  WHERE w.ColorId=2 -- White Color

परिणाम नीचे है:

अब, निम्नलिखित टी-एसक्यूएल स्क्रिप्ट चलाकर कलर आईडी 2 वाली पंक्तियों को हटा दें:

-- Deleting all the rows with color id 2 from main table Watch
DELETE FROM dbo.Watch
WHERE ColorId = 2 -- white color 

आउटपुट इस प्रकार है:

सफ़ेद रंग से सभी पंक्तियों को हटाने के बाद मुख्य तालिका देखें

रंग आईडी 2 वाली किसी भी पंक्ति के लिए हमें मुख्य तालिका की जांच करने की आवश्यकता है:

-- View the watch table data (rows)
SELECT w.WatchId
      ,w.Name
      ,wt.Name AS WatchType
      ,w.ColorId 
      ,c.Name AS ColorName
      ,w.Price FROM dbo.Watch w
  INNER JOIN dbo.Color c ON c.ColorId=w.ColorId
  INNER JOIN dbo.WatchType wt ON w.WatchTypeId = wt.WatchTypeId

जैसा कि हम देखते हैं, सफेद रंग की घड़ियों के रिकॉर्ड अनुपस्थित हैं। यह साबित करता है कि हमने उन सभी पंक्तियों को सफलतापूर्वक हटा दिया है।

संदर्भ तालिका (रंग) से पहले लिंक की गई पंक्ति को हटाना

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

रंग आईडी 2 (सफेद) के साथ पंक्ति को हटाने के लिए संदर्भ रंग तालिका के विरुद्ध निम्न स्क्रिप्ट चलाएँ:

-- View reference table before removing color id 1 (white)
SELECT c.ColorId
      ,c.Name
      ,c.Detail FROM dbo.Color c

-- Deleting one row with color id 2 from the reference table color 
DELETE FROM Color
WHERE ColorId = 2 -- White Color

  -- View reference table after removing color id 1 (white)
SELECT c.ColorId
      ,c.Name
      ,c.Detail FROM dbo.Color c

आउटपुट इस प्रकार है:

बधाई हो!

हमने सीखा है कि किसी संदर्भ तालिका से एक या अधिक पंक्तियों को कैसे हटाया जाए। हम इसे दोनों कर सकते हैं यदि पंक्ति का संदर्भ दिया जा रहा है और यदि नहीं। साथ ही, हमने मुख्य तालिका से पंक्तियों को हटाने की जांच की है।

सारा डेटा मिटाने के बारे में सलाह

एक और टी-एसक्यूएल स्टेटमेंट है जिसे ट्रंकेट टेबल . के नाम से जाना जाता है - यह एक टेबल से सभी डेटा को हटाने के लिए अधिक कुशल है। हालाँकि, तालिका को कहीं और संदर्भित नहीं किया जाना चाहिए क्योंकि तब आपको पहले मुख्य तालिका से डेटा हटाना होगा। यह वैसा ही है जैसा हमने इस लेख में पहले दिखाया था। फिर, हम छंटनी . लागू करेंगे अंतिम चरण के रूप में संदर्भ तालिका के विरुद्ध कथन।

कोड इस प्रकार है:

-- Deleting all rows from the main table using Truncate 
  TRUNCATE TABLE dbo.Watch

हालांकि, डिलीट स्टेटमेंट की तरह ही, आपको Truncate . के साथ बहुत सावधान रहना होगा , या आप तालिका से सभी डेटा को हटा देते हैं।

सलाह का वचन

रीयल-टाइम परिदृश्यों में पंक्तियों को हटाने से हमें या तो मुख्य डेटाबेस से अवांछित डेटा (जैसे सेवानिवृत्त मॉडल) को हटाने में मदद मिलती है या डेटा को संग्रहीत करने और इसे एक संग्रह डेटाबेस में संग्रहीत करने में मदद मिलती है।

करने के लिए चीज़ें

अब जब आप लिंक्ड टेबल जैसे थोड़े उन्नत परिदृश्यों में एक या अधिक पंक्तियों को हटा सकते हैं, तो अपने कौशल को और बेहतर बनाने के लिए निम्न चीज़ें आज़माएँ:

  1. संदर्भ तालिका से एनालॉग घड़ी प्रकार हटाएं घड़ी प्रकार आईडी के आधार पर।
  2. रंग . से सभी पंक्तियां हटाएं संदर्भ तालिका।
  3. नमूना डेटाबेस को रीसेट करने का प्रयास करें और फिर देखें कि आप सभी (संदर्भ और मुख्य) तालिकाओं से सभी डेटा को कितनी तेजी से हटा सकते हैं।

  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. तालिका परिभाषा दिखाने के लिए टी-एसक्यूएल क्वेरी?

  2. SQL सर्वर अवरोधन को हल करने के लिए स्पॉटलाइट क्लाउड का उपयोग करना

  3. SQL सर्वर 2016:हमेशा एन्क्रिप्टेड

  4. DATEADD () SQL सर्वर में उदाहरण

  5. जांचें कि क्या तालिका में OBJECTPROPERTY () के साथ SQL सर्वर में एक विदेशी कुंजी है