7

मैं अपने आवेदन के अगले संस्करण में innodb बाधाओं का उपयोग कर डेटाबेस अखंडता शुरू कर रहा हूँ। सब कुछ ठीक हो जाता है, लेकिन मेरी कुछ तालिकाओं में हटाए गए संदर्भ (मृत रिकॉर्ड) के साथ रिकॉर्ड हैं और उनमें से मैं तालिका में बाधाओं को जोड़ नहीं सकता हूं।डेटाबेस अखंडता को संभालना

मैं कोशिश कर रहा हूँ:

ALTER TABLE `article` ADD FOREIGN KEY (`author_id`) REFERENCES `authors` (`id`) ON DELETE CASCADE; 

और मैं मिलता है:

#1452 - Cannot add or update a child row: a foreign key constraint fails (`books`.<result 2 when explaining filename '#sql-442_dc'>, CONSTRAINT `#sql-442_dc_ibfk_1` FOREIGN KEY (`author_id`) REFERENCES `authors` (`id`) ON DELETE CASCADE) 

इस क्वेरी चल रहा है, मुझे पता चला है कि 500 ​​से अधिक रिकॉर्ड कोई संदर्भ हो (लेखकों हटाए गए, लेकिन उनके लेख बने रहे) :

SELECT `articles`.`id` 
FROM `articles` LEFT JOIN `authors` ON `articles`.`author_id` = `authors`.`id` 
WHERE ISNULL(`authors`.`id`); 

तो, इससे पहले कि मैं एक बाधा जोड़ सकता हूं, मुझे उनसे निपटना होगा। उपरोक्त क्वेरी का उपयोग करके मुझे प्राप्त होने वाले सभी रिकॉर्ड्स को मैं कैसे हटा सकता हूं?

मैं कोशिश की है:

DELETE FROM `articles` WHERE `id` IN (
    SELECT `articles`.`id` 
    FROM `articles` LEFT JOIN `authors` ON `articles`.`author_id` = `authors`.`id` 
    WHERE ISNULL(`authors`.`id`); 
) 

लेकिन mysql प्रतिक्रिया करता है:

You can't specify target table 'articles' for update in FROM clause 

किसी भी मदद के लिए इस पर बहुत सराहना की जाएगी।

+0

प्रयास: http://stackoverflow.com/questions/4770035/handling-database-integrity (डुप्लिकेट) – Benj

+0

@Benj क्यों अपने लिंक बिंदु यह करने के लिए ** सटीक ** करता है एसओ पोस्ट? –

+0

@ बुहकेसिंडी अच्छा ... ऐसा लगता है कि मैं अपनी प्रतिलिपि में विफल रहा ... इसे इंगित करने के लिए धन्यवाद। मुझे खेद है कि मैं (साल बाद) मूल लिंक पुनर्प्राप्त नहीं कर सकता। – Benj

उत्तर

14

मैं MySQL के कई अजीब समस्याओं के साथ भी परिचित नहीं हूँ, लेकिन यह भी काम करना चाहिए, और शायद MySQL उस पर गला घोंटना नहीं होगा:

delete from articles 
where not exists (
      select id from authors 
      where authors.id = articles.author_id 
     ) 

उम, बेशक हम हमेशा तालिका का बैकअप है इससे पहले कि हम सेट के आधार पर हटाए गए :) वहाँ देखें

+0

+1, मेरे सटीक डुप्लिकेट को पोस्ट करने की कोई आवश्यकता नहीं है :) – Ronnis

+0

+1 या मेरा या तो। –

+0

धन्यवाद, यह मेरे लिए काम किया! मैं पहले से ही अस्थायी तालिका का उपयोग कर बदसूरत समाधान के साथ आया हूं, लेकिन यह एक चट्टानों :) मैं कुछ समय के लिए एक प्रश्न खुला छोड़ दूंगा ताकि आप अधिक अपवित्र हो सकें :) –

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