2012-04-13 17 views
16

मैं इन तालिकाओं है:एकाधिक तालिकाओं से डेटा कैसे हटाएं?

 
event  (evt_id, evt_code, reg_id) 

magnitude (mag_id, evt_id, value) 

trace  (trace_id, pt_id) 

point  (pt_id, evt_id) 

मैं evt_id=1139 से संबंधित सभी तालिकाओं से सभी पंक्तियों को हटाना चाहते हैं।
मैं इसे कैसे कर सकता हूं?

उत्तर

17

यदि आपके स्कीमा पर नियंत्रण है, तो मैं स्कीमा cascading deletes का उपयोग कर दूंगा।

लेख से (और अधिक उचित हिस्से पर आपके उदाहरण के लिए अनुवाद)

CREATE TABLE point 
(
    pt_id integer PRIMARY KEY, 
    evt_id integer REFERENCES event ON DELETE CASCADE 
) 

आप की स्थापना की cascades है, तो आप सिर्फ मुख्य समारोह तालिका से हटा सकते हैं और अन्य सभी तालिकाओं साफ हो जाएगा स्वचालित रूप से

अन्यथा, आपको पहले सभी संदर्भों को हटाने की आवश्यकता है, फिर आप मुख्य तालिका हटा दें। आप एक लेन-देन में करना चाहिए डेटा संगत रखने के लिए

BEGIN; 
DELETE FROM trace WHERE EXISTS 
    (SELECT 1 FROM point WHERE evt_id = 1139 AND trace.pt_id = point.pt_id); 
DELETE FROM point where evt_id = 1139; 
DELETE FROM magnitude where evt_id = 1139; 
DELETE FROM event where evt_id = 1139; 
COMMIT; 
-3
$delete = 1139; 
$query = "DELETE FROM event, magnitude, point WHERE evt_id = '$delete'"; 
mysql_query($query, $con); 
$query = "DELETE FROM trace WHERE pt_id = '$delete'"; 

या सिर्फ एक sql फ़ाइल में है कि बयान पेस्ट करें और इसे चलाने के लिए, या अपने एसक्यूएल सॉफ्टवेयर क्वेरी विंडो में, या एक .php में रखें फ़ाइल और सर्वर पर चलाएं।

+1

जहाँ तक मुझे पता है, आप इस तरह की कई तालिकाओं से हटा नहीं सकते हैं (लेकिन मैं गलत हो सकता हूं)। हालांकि, कम से कम 'trace' में evt_id कॉलम नहीं है –

+0

डेटाबेस सर्वर पर है। मैं इस क्वेरी फ़ाइल को कैसे चला सकता हूं? – user1202766

+0

हां, सच्चे निशान में evt_id कॉलम नहीं है लेकिन pt_id है जो बिंदु तालिका से है जिसमें evt_id कॉलम है..यह भ्रमित है! – user1202766

-1

मुझे लगता है कि आईडी अलग-अलग तालिकाओं में मेल खाती है और लिंक करने के लिए उपयोग की जाती है। मैं आपको यह भी allthough वे केवल परोक्ष रूप से evt_id को

इस प्रकार आप सभी तालिकाओं से अपने रिकॉर्ड नष्ट कर सकते हैं जुड़े हुए हैं सभी का पता लगाने अंक हटाना चाहते हैं मान:

DELETE event , magnitude, trace, point 
FROM event left join magnitude on event.evt_id = magnitude.evt_id 
    left join point on event.evt_id = point.evt_id 
     left join trace on point.pt_id = trace.trace_id 
where event_id=1139 
+5

काम नहीं करेगा यह केवल MySQL में काम करेगा, और ओपी ने इस प्रश्न को mysql और postgresql से केवल postgresql में दोबारा टैग किया है –

4

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

http://www.postgresql.org/docs/9.1/static/ddl-constraints.html#DDL-CONSTRAINTS-FK

7

अपने प्रश्न में केवल गैर तुच्छ तत्व तालिका trace से हटाए गए हैं। मुझे लगता है कि trace.pt_id मानना ​​सुरक्षित है point.pt_id का संदर्भ दे रहा है?

या तो आप एक foreign key with ON DELETE CASCADE को परिभाषित करने और बस के बारे में मेज trace (पहले से ही pointed out by @kevin रूप में) या आप पंक्तियों मैन्युअल निर्भर करता है की देखभाल करने के लिए है भूल जाते हैं।

PostgreSQL 9.1 जब से तुम data-modifying CTEs उपयोग कर सकते हैं:

BEGIN; 

WITH x AS (
    DELETE FROM point WHERE evt_id = 1139 
    RETURNING pt_id 
    ) 
DELETE FROM trace 
USING x 
WHERE trace.pt_id = x.pt_id; 

DELETE FROM magnitude WHERE evt_id = 1139; 

DELETE FROM event WHERE evt_id = 1139; 

COMMIT; 

सभी DELETE FROM point रिटर्न के RETURNING clausept_id प्रभावित - उन trace से सभी इसी पंक्तियां हटाना इस्तेमाल किया बदले में कर रहे हैं।

आपने यह उल्लेख नहीं किया कि आपके मामले में सहमति एक समस्या है या नहीं। यदि ऐसा है, और यदि आप evt_id = 1139 के लिए पंक्तियों में से किसी एक तालिका में मौजूद हैं, तो पहले से हटाए गए हैं, तो इसे लेनदेन में लपेटें।
यदि यह आपके लिए कोई चिंता नहीं है, तो BEGIN और COMMIT अनदेखा करें।