2009-08-18 23 views
5

यह कुछ हद तक this question से संबंधित है के द्वारा संदर्भित नहीं निकालें:पंक्तियों एक विदेशी कुंजी

मैं एक प्राथमिक कुंजी के साथ एक मेज है, और मुझे कई तालिकाओं का संदर्भ है कि प्राथमिक कुंजी (विदेशी कुंजी का उपयोग) है। मुझे उस तालिका से पंक्तियों को हटाने की जरूरत है, जहां प्राथमिक कुंजी को उन किसी भी अन्य तालिका (साथ ही कुछ अन्य बाधाओं) में संदर्भित नहीं किया जा रहा है।

उदाहरण के लिए:

Group 
groupid | groupname 
    1 | 'group 1' 
    2 | 'group 3' 
    3 | 'group 2' 
    ... | '...' 

Table1 
tableid | groupid | data 
    1 | 3 | ... 
    ... | ... | ... 

Table2 
tableid | groupid | data 
    1 | 2 | ... 
    ... | ... | ... 

और इतने पर। समूह में से कुछ पंक्तियों को किसी भी तालिका में संदर्भित नहीं किया गया है, और मुझे उन पंक्तियों को हटाने की आवश्यकता है। इसके अलावा, मुझे यह जानने की जरूरत है कि समूह में दी गई पंक्ति का संदर्भ देने वाली सभी सारणी/पंक्तियों को कैसे ढूंढें।

मुझे पता है कि मैं सिर्फ प्रत्येक तालिका से पूछता हूं और समूह की जांच कर सकता हूं, लेकिन चूंकि वे विदेशी कुंजी हैं, इसलिए मुझे लगता है कि ऐसा करने का एक बेहतर तरीका है।

यह पोस्टग्रेस्क्ल 8.3 का उपयोग कर रहा है।

उत्तर

3

यह के केंद्र में, एसक्यूएल सर्वर, बाधाओं के लिए 2 तरह की जानकारी नहीं बनाए रखते हैं तो अपने ही एकमात्र विकल्प सर्वर आंतरिक रूप से क्या करेंगे अगर आप पंक्ति को हटा रहे थे करने के लिए है: हर दूसरे की जाँच तालिका।

यदि (और पहले सुनिश्चित करें कि पहले) आपकी बाधाएं सरल जांच हैं और किसी भी "डिलीट कैस्केड" टाइप स्टेटमेंट्स पर नहीं ले जाती हैं, तो आप अपनी समूह तालिका से सबकुछ हटाने का प्रयास कर सकते हैं। कोई भी पंक्ति जो हटाती है, इस प्रकार इसका कोई संदर्भ नहीं होगा। अन्यथा, आप Quassnoi के जवाब से अटक गए हैं।

10
DELETE 
FROM group g 
WHERE NOT EXISTS 
     (
     SELECT NULL 
     FROM table1 t1 
     WHERE t1.groupid = g.groupid 
     UNION ALL 
     SELECT NULL 
     FROM table1 t2 
     WHERE t2.groupid = g.groupid 
     UNION ALL 
     … 
     ) 
+3

ठीक है जैसे मैंने कहा कि मैं इस स्थिति से बचना चाहता हूं। कई टेबल हैं, नाम सम्मेलन मानक नहीं हैं और यह धीमा है। चूंकि बाधा पहले से ही मौजूद है, मुझे लगता है कि एक बेहतर तरीका होना चाहिए। –

संबंधित मुद्दे