2010-01-06 6 views
5

मैं तीसरी टेबल आईडी के आधार पर दो निर्भर तालिकाओं में सभी पंक्तियों को हटाने का प्रयास कर रहा हूं।[MySQL]: दो निर्भर तालिकाओं से पंक्तियां हटाएं

तालिका संरचना:

Transaction 
-Transaction_ID (primary) 
-Timestamp 

Purchase 
-Item_ID 
-Transaction_ID 
-Purchase_ID (primary) 

Item 
-Item_ID (primary) 
-Client_ID 

मैं लेन-देन/खरीद से सभी पंक्तियों है कि आइटम में client_id से मेल खाते हैं मिटा देना चाहते हैं। काफी सरल लगता है ... यहां तक ​​कि मुझे लगता है कि चारों ओर मेरी नौसिखिया मन लपेट कर सकते हैं ...

DELETE dbName.t FROM 
    dbName.Transaction t 
JOIN 
    dbName.Purchase p 
ON 
    p.Transaction_ID = t.Transaction_ID 
JOIN 
    dbName.Item i 
ON 
    p.Item_ID = i.Item_ID 
WHERE 
    Client_ID = 1 

नहीं ...

मैं यह त्रुटि foreign key constraint fails... मिलता - मुझे यकीन है कि कई की आप हैरान नहीं हैं हूँ।

क्या समस्या है कि खरीद t.Transaction_ID का उपयोग करता है? - (इस प्रकार, यह विदेशी कुंजी असफल हो जाएगी)

या इस तालिका में अन्य टी.Transaction_ID निर्भर डेटा होने की संभावना है (मुझे कोई नहीं मिला है)।

संपादित करें: COMPLETE ERROR

Cannot delete or update a parent row: a foreign key constraint fails 
(`ItemTracker_dbo/Purchase`, CONSTRAINT `FK_Purchase_Transaction` 
FOREIGN KEY (`Transaction_ID`) REFERENCES `Transaction` (`Transaction_ID`) 
ON DELETE NO ACTION ON UPDATE CASCADE) 

उत्तर

4
चालू हटाना कैस्केड पर पीछे की ओर यह करना या निर्धारित करने की आवश्यकता है

जब तक निर्भर रिकॉर्ड अभी भी किसी अन्य तालिका में मौजूद नहीं हैं तब तक आप किसी तालिका से हटा नहीं सकते हैं। आपके मामले में, निर्भरता

Transaction <- Purchase -> Item 

तो लेनदेन को हटाने से पहले आपको किसी भी खरीद को हटाने की आवश्यकता है।

कि दो कदम दृष्टिकोण के लिए एक विकल्प के रूप में, मैं एक ON DELETE CASCADE constraint स्थापित करने की सलाह देते हैं और इस के साथ जाना होगा:

DELETE 
    Transaction 
WHERE 
    Transaction_ID IN (
    SELECT 
     Transaction_ID 
    FROM 
     Purchase INNER JOIN Item ON Item.Item_ID = Purchase.Item_ID 
    WHERE 
     Item.Client_ID = <your Client ID here> 
) 

खबरदार है कि इस को हटा देता है किसी भी Transaction (और, CASCADE के माध्यम से, किसी भी Purchase) जहां मिलान के साथ Item पर निर्भर है, इस पर ध्यान दिए बिना कि अन्य आइटम हैं या नहीं। यदि यह वही नहीं है जो आप चाहते हैं, तो सवाल को परिष्कृत करने की आवश्यकता है।

+0

मेरे लिए यह विपरीत जैसा लगता है - लेनदेन खरीद पर निर्भर है (जैसा कि मैं क्लाइंट_आईडी w/o द्वारा हटा नहीं सकता) –

+0

@ डेरेक एडैयर: चूंकि @ अल्बर्टएन सही सवाल का जवाब देने वाले पहले व्यक्ति थे, और मेरी पोस्ट को एक बड़ा ओवरहाल चाहिए इससे पहले कि यह उपयोगी था, कृपया उसका जवाब स्वीकार करने पर विचार करें। – Tomalak

+0

कोई ध्यान से देखो, आपके पास अपनी खरीद तालिका के अंदर एक Transaction_ID है। यदि आपने पहले लेनदेन को हटा दिया है, तो खरीद तालिका अस्थायी रूप से एक अमान्य लेनदेन_आईडी होगी जो मौजूद नहीं थी। – MindStalker

2
Transaction <- Purchase -> Item 

आपकी समस्या यह है कि आप, खरीद, यह खरीद और उसके बाद ही लेन-देन हटा रहा है ऐसा करने के लिए सही तरीका हटाने से पहले लेन-देन को हटाने के लिए कोशिश कर रहे हैं वह यह है कि , या आप अपनी विदेशी कुंजी पर डिलीट कैस्केड पर उपयोग कर सकते हैं, ऐसा लगता है कि आप का उपयोग DELETE RESTRICT पर कर रहे हैं।

यहाँ देखें: http://dev.mysql.com/doc/refman/5.0/es/innodb-foreign-key-constraints.html

इसके अलावा, अगर आप यह सुनिश्चित करें कि कारण आप पूरा त्रुटि देना चाहिए है, डीबीएमएस आमतौर पर आपको बताता है कि क्या विदेशी कुंजी उल्लंघन त्रुटि बढ़ा रहा है होने के लिए wan't।

अद्यतन: अपने त्रुटि यह स्पष्ट कर दिया, समस्या यह है कि आप खरीद पहले हटा रहे हैं और उसके बाद लेन-देन, आप अपने विदेशी कुंजी बाधा

+0

मेरे उत्तर के नीचे की टिप्पणियां अब एक लाल हेरिंग हैं। क्या हमें उन्हें हटा देना चाहिए? – Tomalak

+0

मेरे लिए कोई समस्या नहीं है। इसलिए, यदि आप उन्हें हटा देते हैं तो मैं उन्हें भी हटा दूंगा;) – albertein

+0

ठीक है, अब हटा रहा है। जब हम कर लेंगे, तो मैं आपके उत्तर की ओर एक सिफारिश पोस्ट करूंगा, क्योंकि आपने इसे मेरे सामने ठीक कर लिया था। – Tomalak