tutorial - mysql w3schools




MySQL-एक क्वेरी के साथ एकाधिक तालिकाओं से हटाएं (6)

आप ON DELETE CASCADE विकल्प के साथ टेबल पर विदेशी कुंजी बाधाओं को परिभाषित कर सकते हैं।

फिर अभिभावक तालिका से रिकॉर्ड हटाना बाल तालिकाओं से रिकॉर्ड हटा देता है।

इस लिंक को जांचें: http://dev.mysql.com/doc/refman/5.5/en/innodb-foreign-key-constraints.html

इस प्रश्न का उत्तर यहां दिया गया है:

मेरे पास 4 टेबल हैं जो प्रत्येक में उपयोगकर्ता के बारे में अलग-अलग जानकारी संग्रहीत करती हैं। प्रत्येक तालिका में user_id के साथ एक फ़ील्ड है यह पहचानने के लिए कि कौन सी पंक्ति उपयोगकर्ता से संबंधित है। यदि मैं उपयोगकर्ता को हटाना चाहता हूं तो यह एकाधिक उपयोगकर्ताओं से उस उपयोगकर्ता की जानकारी को हटाने का सबसे अच्छा तरीका है? मेरा उद्देश्य एक प्रश्न में ऐसा करना है।

प्रश्न:

"DELETE FROM table1 WHERE user_id='$user_id';
DELETE FROM table2 WHERE user_id='$user_id';
DELETE FROM table3 WHERE user_id='$user_id';
DELETE FROM table4 WHERE user_id='$user_id';";

आप कई तालिकाओं से पंक्तियों को हटाने के लिए निम्न क्वेरी का उपयोग कर सकते हैं,

DELETE table1, table2, table3 FROM table1 INNER JOIN table2 INNER JOIN table3 WHERE table1.userid = table2.userid AND table2.userid = table3.userid AND table1.userid=3


आम तौर पर आप एक साथ कई टेबलों से हटा नहीं सकते हैं, जब तक आप अन्य उत्तरों में दिखाए गए जॉइन का उपयोग नहीं करेंगे।

हालांकि अगर आपकी सभी टेबल कुछ नाम से शुरू होती हैं, तो यह क्वेरी क्वेरी उत्पन्न करेगी जो वह कार्य करेगी:

SELECT CONCAT('DELETE FROM ', GROUP_CONCAT(TABLE_NAME SEPARATOR ' WHERE user_id=123;DELETE FROM ') , 'FROM table1;' ) AS statement FROM information_schema.TABLES WHERE TABLE_NAME LIKE 'table%'

फिर इसे निष्पादन के लिए mysql कमांड में (खोल में) पाइप करें।

उदाहरण के लिए यह कुछ उत्पन्न करेगा:

DELETE FROM table1 WHERE user_id=123;
DELETE FROM table2 WHERE user_id=123;
DELETE FROM table3 WHERE user_id=123;

अधिक खोल उन्मुख उदाहरण होगा:

echo "SHOW TABLES LIKE 'table%'" | mysql | tail -n +2 | xargs -L1 -I% echo "DELETE FROM % WHERE user_id=123;" | mysql -v

यदि आप इसके लिए केवल MySQL का उपयोग करना चाहते हैं, तो आप अधिक उन्नत क्वेरी के बारे में सोच सकते हैं, जैसे कि:

SET @TABLES = (SELECT GROUP_CONCAT(TABLE_NAME) FROM information_schema.TABLES WHERE TABLE_NAME LIKE 'table%');
PREPARE drop_statement FROM 'DELETE FROM @tables';
EXECUTE drop_statement USING @TABLES;
DEALLOCATE PREPARE drop_statement;

उपरोक्त उदाहरण इस पर आधारित है: MySQL - विशिष्ट उपसर्ग के साथ सभी तालिकाओं को हटाएं / छोड़ें


आम तौर पर, मैं इसे एक ट्रिगर में लागू 'कैस्केडिंग डिलीट' के रूप में उम्मीद करता हूं, आपको केवल मुख्य रिकॉर्ड को हटाना होगा, फिर सभी डिप्पेन्डेंट रिकॉर्ड ट्रिगर तर्क से हटा दिए जाएंगे।

यह तर्क आपके द्वारा लिखे गए कार्यों के समान होगा।


जाहिर है, यह संभव है। manual :

WHERE क्लॉज में विशेष स्थिति के आधार पर आप एक या अधिक तालिकाओं से पंक्तियों को हटाने के लिए DELETE कथन में एकाधिक तालिकाओं को निर्दिष्ट कर सकते हैं। हालांकि, आप एक बहु-तालिका DELETE में ORDER BY या LIMIT का उपयोग नहीं कर सकते हैं। Table_references खंड में शामिल होने वाली तालिकाओं को सूचीबद्ध करता है। इसका वाक्यविन्यास खंड 12.2.8.1, "सिंटेक्स जॉइन" में वर्णित है।

मैनुअल में उदाहरण है:

DELETE t1, t2 FROM t1 INNER JOIN t2 INNER JOIN t3
WHERE t1.id=t2.id AND t2.id=t3.id;

लागू होना चाहिए 1: 1।


विदेशी कुंजी के साथ दो तालिकाओं से आप इस क्वेरी को आजमा सकते हैं:

DELETE T1, T2
FROM T1
INNER JOIN T2 ON T1.key = T2.key
WHERE condition




mysql