2011-12-15 8 views
6

मैं एक तालिका से अप्रयुक्त पंक्तियों को हटाने की कोशिश कर रहा हूं। यह मेरी समस्या का उदाहरण सरलीकृत है:एसक्यूएल का उपयोग कर डीबी टेबल से अप्रयुक्त पंक्तियों को कैसे हटाएं?

user table: 

user_id user_name 
-------------------- 
1   Mike 
3   Carol 
8   Eric 


address table: 

user_id address 
----------------------- 
1   [email protected]   
3   [email protected] 
10   [email protected] 
3   [email protected] 

मैं पता मेज से अप्रयुक्त पतों को हटाना चाहते हैं:

2 टेबल रहे हैं। यदि उपयोगकर्ता तालिका में किसी पते का user_id मौजूद है, तो पता अप्रयुक्त है। उदाहरण तालिका में एक अप्रयुक्त पता है: [email protected]

मैं एसक्यूएल के साथ नया हूँ, और मेरे समाधान बदसूरत था:

DELETE FROM address 
    WHERE NOT EXISTS 
    (SELECT * FROM user WHERE address.user_id = user.user_id); 

यह करने के लिए बेहतर तरीका होना चाहिए। ऐसा करने का सबसे अच्छा तरीका क्या है?

वर्ग का उपयोग किया जाता है।

+4

मुझे बहुत बदसूरत नहीं लग रहा है, आप क्या सुधारना चाहते हैं - देखो, प्रदर्शन? –

+0

इस तरह मैंने इसे किया होगा। एक बार जब आप रेफरेंसियल अखंडता स्थापित कर लेंगे, तो यह फिर से नहीं होगा। यदि आप रेफरेंसियल अखंडता नहीं रखते/नहीं कर सकते हैं तो "बदसूरत" आपके पास सबसे अच्छा हो सकता है। –

+0

@ पाउल: मैं सिर्फ सामान्य अभ्यास देख रहा हूं, यह समस्या आमतौर पर हल कैसे होती है। इसके अलावा, मैं प्रदर्शन के बारे में चिंतित था: ऐसा लगता है कि चयन तालिका की प्रत्येक पंक्ति के अनुसार चयन कथन की खोज एक बार की जाती है। – SKi

उत्तर

4

इसे इस तरह कार्य करें:

DELETE FROM address 
    WHERE user_id NOT IN (SELECT user_id FROM user); 
4

आपके मामले में, आप user में प्राथमिक कुंजी के रूप और address में एक विदेशी कुंजी के रूप में user_id स्थापित करने पर विचार करना चाहिए। इस प्रकार, यदि आप user में अपने किसी एक उपयोगकर्ता को हटाते हैं, तो आप पते में संबंधित पंक्तियों को स्वचालित रूप से हटाने के लिए ON DELETE CASCADE विकल्प सेट कर सकते हैं।

आपकी तालिका के निर्माण के दौरान, आप केवल कुछ इस तरह करने की जरूरत है:

CREATE TABLE user (
    user_id INTEGER, 
    user_name VARCHAR(30), 
    PRIMARY KEY (user_id) 
); 

CREATE TABLE address (
    user_id INTEGER, 
    address VARCHAR(30), 
    PRIMARY KEY (user_id, address), 
    FOREIGN KEY (user_id) REFERENCES user(user_id) 
    ON DELETE CASCADE 
); 

मूल रूप से, प्रत्येक उपयोगकर्ता के लिए एक अनूठा user_id है। यदि आप उन उपयोगकर्ताओं में से किसी एक को हटाते हैं, तो address में संबंधित पते भी हटा दिए जाएंगे क्योंकि user.user_idaddress.user_id "पॉइंट टू" हटा दिया गया है।

यदि आप केवल उन अप्रयुक्त पते को हटाना चाहते हैं, तो आपके समाधान को ठीक काम करना चाहिए।

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