MySQL में सबक्वेरी के परिणाम के आधार पर पंक्तियाँ डिलीट करने के लिए, DELETE ... WHERE IN (subquery) पैटर्न का उपयोग करें। MySQL में उसी टेबल को सीधे सबक्वेरी में संदर्भित नहीं कर सकते, इसलिए डिराइव्ड टेबल (उपनाम के साथ) का उपयोग करना आवश्यक है।
उदाहरण: पहले 3 रिकॉर्ड डिलीट करना (Id द्वारा क्रमबद्ध)
डेमो टेबल बनाएं:
mysql> CREATE TABLE DemoTable1947 (
Id INT,
Name VARCHAR(20)
);
डेटा इन्सर्ट करें:
mysql> INSERT INTO DemoTable1947 VALUES (101, 'Chris'), (102, 'David'), (103, 'Mike'), (104, 'Bob'), (105, 'Sam');
डेटा:
+------+-------+ | Id | Name | +------+-------+ | 101 | Chris | | 102 | David | | 103 | Mike | | 104 | Bob | | 105 | Sam | +------+-------+
सबक्वेरी के साथ डिलीट (पहले 3 Id):
mysql> DELETE FROM DemoTable1947
WHERE Id IN (
SELECT * FROM (
SELECT Id FROM DemoTable1947 ORDER BY Id LIMIT 3
) AS t
);
आउटपुट: Query OK, 3 rows affected
शेष डेटा:
+------+------+ | Id | Name | +------+------+ | 104 | Bob | | 105 | Sam | +------+------+
महत्वपूर्ण: डिराइव्ड टेबल (उपनाम 't') आवश्यक है
MySQL नहीं अनुमति देता:
-- एरर: You can't specify target table 'DemoTable1947' for update in FROM clause DELETE FROM DemoTable1947 WHERE Id IN (SELECT Id FROM DemoTable1947 ORDER BY Id LIMIT 3);
समाधान: सबक्वेरी को डिराइव्ड टेबल में लपेटें:
DELETE FROM DemoTable1947 WHERE Id IN (SELECT * FROM (SELECT Id FROM DemoTable1947 ORDER BY Id LIMIT 3) AS t);
वैकल्पिक: JOIN के साथ DELETE (अक्सर तेज़)
DELETE d
FROM DemoTable1947 d
JOIN (
SELECT Id FROM DemoTable1947 ORDER BY Id LIMIT 3
) t ON d.Id = t.Id;
अन्य सामान्य पैटर्न
डुप्लिकेट रखते हुए पहली पंक्ति डिलीट करें
DELETE t1 FROM table t1 JOIN table t2 ON t1.dup_col = t2.dup_col AND t1.id > t2.id;
पुराने रिकॉर्ड डिलीट करें (बैच में)
DELETE FROM logs
WHERE id IN (
SELECT * FROM (SELECT id FROM logs WHERE created_at < '2023-01-01' LIMIT 1000) AS t
);
सावधानियां
- बैकअप: बड़े DELETE से पहले बैकअप लें
- ट्रांजैक्शन: स्पष्ट ट्रांजैक्शन में चलाएं
- लॉक: बड़ी डिलीट टेबल लॉक कर सकती है; बैच में करें
- विदेशी कुंजी: ON DELETE CASCADE/SET NULL/RESTRICT व्यवहार जांचें
डिराइव्ड टेबल ट्रिक MySQL की एक ज्ञात सीमा का समाधान है और DELETE/UPDATE सबक्वेरी के लिए मानक पैटर्न है।