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

Postgresql एकाधिक तालिकाओं से एकाधिक पंक्तियों को हटा दें

उचित कैस्केडिंग डिलीट की व्यवस्था करना बुद्धिमानी है और आमतौर पर इसका सही समाधान है। कुछ विशेष मामलों के लिए, इसका एक और समाधान है जो प्रासंगिक हो सकता है।

यदि आपको डेटा के एक सामान्य सेट के आधार पर एकाधिक डिलीट करने की आवश्यकता है तो आप का उपयोग कर सकते हैं। कॉमन टेबल एक्सप्रेशन (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)

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



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Psycopg / Postgres :कनेक्शन बेतरतीब ढंग से लटकते हैं

  2. पोस्टग्रेज में किसी फ़ील्ड से रेगेक्स में अनचाहे टेक्स्ट जोड़ने का सही तरीका?

  3. पोस्टग्रेएसक्यूएल डीबी से टिप्पणियां प्राप्त करना

  4. फायरबेस:बाहरी डीबी से कैसे पढ़ा जाए?

  5. तालिका को पैरामीटर के रूप में पास करना