उचित कैस्केडिंग डिलीट की व्यवस्था करना बुद्धिमानी है और आमतौर पर इसका सही समाधान है। कुछ विशेष मामलों के लिए, इसका एक और समाधान है जो प्रासंगिक हो सकता है।
यदि आपको डेटा के एक सामान्य सेट के आधार पर एकाधिक डिलीट करने की आवश्यकता है तो आप का उपयोग कर सकते हैं। कॉमन टेबल एक्सप्रेशन (CTE) ।
एक साधारण उदाहरण के साथ आना मुश्किल है क्योंकि इसके लिए मुख्य उपयोग के मामले को कैस्केडिंग डिलीट द्वारा कवर किया जा सकता है।
उदाहरण के लिए हम तालिका A में सभी आइटम्स को हटाने जा रहे हैं, जिसका मान उन मानों के सेट में है जिन्हें हम तालिका B से हटा रहे हैं। आमतौर पर ये कुंजियाँ होंगी, लेकिन जहाँ वे नहीं हैं, वहाँ कैस्केडिंग डिलीट का उपयोग नहीं किया जा सकता है ।
इसे हल करने के लिए आप सीटीई का उपयोग करते हैं
WITH Bdeletes AS (
DELETE from B where IsSomethingToDelete = true returning ValueThatRelatesToA
)
delete from A where RelatedValue in (select ValueThatRelatesToA from Bdeletes)
यह उदाहरण जानबूझकर सरल है क्योंकि मेरी बात कुंजी मानचित्रण आदि पर बहस करने की नहीं है, बल्कि यह दिखाने के लिए है कि एक साझा डेटासेट से दो या दो से अधिक डिलीट कैसे किए जा सकते हैं। यह बहुत अधिक जटिल भी हो सकता है, जिसमें अपडेट कमांड आदि शामिल हैं।
यहाँ एक अधिक जटिल उदाहरण है (डार्थ वाडर के व्यक्तिगत डेटाबेस से)। इस मामले में, हमारे पास एक तालिका है जो एक पता तालिका का संदर्भ देती है। हमें पता तालिका से पतों को हटाना होगा यदि वे उसके द्वारा नष्ट किए गए ग्रहों की सूची में हैं। हम इस जानकारी का उपयोग लोगों की तालिका से हटाने के लिए करना चाहते हैं, लेकिन केवल तभी जब वे ग्रह पर हों (या उनकी ट्रॉफी-किल सूची में)
with AddressesToDelete as (
select AddressId from Addresses a
join PlanetsDestroyed pd on pd.PlanetName = a.PlanetName
),
PeopleDeleted as (
delete from People
where AddressId in (select * from AddressesToDelete)
and OffPlanet = false
and TrophyKill = false
returning Id
),
PeopleMissed as (
update People
set AddressId=null, dead=(OffPlanet=false)
where AddressId in (select * from AddressesToDelete)
returning id
)
Delete from Addresses where AddressId in (select * from AddressesToDelete)
अब उनका डेटाबेस अप टू डेट है। पता हटाने के कारण कोई अखंडता विफलता नहीं है। ध्यान दें कि जब हम अपडेट से डेटा वापस कर रहे हैं और पहले डिलीट कर रहे हैं, तो इसका मतलब यह नहीं है कि हमें इसका उपयोग करना होगा। मैं अनिश्चित हूं कि क्या आप बिना लौटाए गए डेटा वाले सीटीई में एक डिलीट डाल सकते हैं (मेरा एसक्यूएल अपडेट से लौटने के उपयोग पर भी गलत हो सकता है - मैं इसे चलाने का परीक्षण करने में सक्षम नहीं हूं क्योंकि डार्थ वी। कर्कश मूड।