2011-06-22 10 views
10

मेरे पास एक सारणी है जिसमें कई इतिहास प्रविष्टियां हैं जिनमें ग्राहक आईडी शामिल हैं।अनाथ पंक्तियों को हटाने के लिए सुरुचिपूर्ण तरीका?

एक अलग ग्राहक तालिका है। कभी-कभी कुछ ग्राहक प्रविष्टियां हटा दी जाती हैं।

क्या इतिहास इतिहास में सभी पंक्तियों को छोड़ने के लिए प्रत्येक इतिहास प्रविष्टि के माध्यम से लूपिंग के बिना कोई आसान तरीका है, जहां ग्राहक आईडी अब मौजूद नहीं है क्योंकि ग्राहक पंक्ति हटा दी गई थी?

+0

क्या आप प्रत्येक बार जब ग्राहक हटा दिए जाते हैं, या केवल समय-समय पर हटाना चाहते हैं? –

उत्तर

25
delete from history_table where customer_id not in (select customer_id from customers) 

किया?

+0

इसकी कमजोरी यह है कि यह स्वयं-जुड़ने को संभाल नहीं सकता है (उदाहरण के लिए तालिका में अभिभावक)। यह उचित जुड़ाव से भी धीमा हो सकता है ... लेकिन यह शायद छोटी टेबल पर महत्वहीन हो सकता है। –

8
DELETE h.* FROM history h 
LEFT JOIN customer c ON h.customer_id = c.id 
WHERE c.id IS NULL 

मैं इसे अपने सिर के शीर्ष से टाइप कर रहा हूं, लेकिन आपको आशा है कि आपको उम्मीद है।

Delete syntax documentation

+0

यह उचित समाधान है। –

5

कैसे के बारे में: यदि आप कुछ इस तरह का मतलब

DELETE FROM history_table 
WHERE customer_id NOT IN (SELECT customer_id FROM customer); 
1
DELETE FROM CUSTOMER_HISTORY CH 
WHERE NOT EXIST (SELECT 1 FROM CUSTOMER C WHERE C.CUSTOMER_ID = CH.CUSTOMER_ID) 
4

आप इसे पूरा करने के लिए विदेशी कुंजी के साथ कैस्केडिंग का उपयोग कर सकते हैं। निम्न उदाहरण में, किसी भी समय ए से एक पंक्ति हटा दी जाती है, या ए में ए_आईडी बदल जाती है, यह परिवर्तन स्वचालित रूप से तालिका बी में दिखाई देगा। आप विदेशी कुंजी in the MySql Documentation पर और अधिक पढ़ सकते हैं।

CREATE TABLE A(
    A_ID INT, 
    PRIMARY_KEY(A_ID) 
) TYPE=InnoDB; 

CREATE TABLE B(
    B_ID INT, 
    A_ID INT, 
    CONSTRAINT FK_B_A FOREIGN KEY REFERENCES A(A_ID) ON DELETE CASCADE ON UPDATE CASCADE, 
    PRIMARY_KEY(B_ID, A_ID) 
) TYPE=InnoDB; 
संबंधित मुद्दे

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