MySQL में एक ही क्वेरी में एकाधिक विशिष्ट रिकॉर्ड डिलीट करने के लिए, DELETE स्टेटमेंट के साथ IN() ऑपरेटर का उपयोग करें। यह एकाधिक DELETE स्टेटमेंट चलाने से अधिक कुशल और पठनीय है।
उदाहरण: विशिष्ट StudentId वाले रिकॉर्ड डिलीट करना
डेमो टेबल बनाएं:
mysql> CREATE TABLE DemoTable1922 (
StudentId INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
StudentName VARCHAR(20)
);
डेटा इन्सर्ट करें:
mysql> INSERT INTO DemoTable1922 (StudentName) VALUES
('Chris'), ('Robert'), ('David'), ('Mike');
डिलीट से पहले:
+-----------+-------------+ | StudentId | StudentName | +-----------+-------------+ | 1 | Chris | | 2 | Robert | | 3 | David | | 4 | Mike | +-----------+-------------+
IN() के साथ एक क्वेरी में डिलीट करें:
mysql> DELETE FROM DemoTable1922 WHERE StudentId IN (1, 2, 3, 4);
आउटपुट: Query OK, 4 rows affected
डिलीट के बाद:
mysql> SELECT * FROM DemoTable1922; Empty set (0.00 sec)
सिंटैक्स
DELETE FROM table_name WHERE column_name IN (value1, value2, ..., valueN);
लाभ
- एटॉमिक: सभी डिलीट एक ही ट्रांजैक्शन में
- कुशल: सिंगल टेबल स्कैन, सिंगल लॉक अधिग्रहण
- पठनीय: इरादा स्पष्ट है
- नेटवर्क: एक राउंड-ट्रिप बनाम एकाधिक
सबक्वेरी के साथ IN()
दूसरे टेबल या शर्त के आधार पर डिलीट करें:
-- निष्क्रिय यूज़र्स के ऑर्डर डिलीट करें DELETE FROM orders WHERE user_id IN (SELECT id FROM users WHERE status = 'inactive'); -- पुराने लॉग डिलीट करें DELETE FROM logs WHERE id IN (SELECT id FROM logs WHERE created_at < '2023-01-01' LIMIT 1000);
सावधानियां
- WHERE के बिना:
DELETE FROM tableसभी पंक्तियाँ डिलीट कर देगा (TRUNCATE से धीमा) - बड़े IN लिस्ट: बहुत बड़ी लिस्ट (हजारों) के लिए, अस्थायी टेबल या JOIN बेहतर हो सकता है
- विदेशी कुंजी: ON DELETE RESTRICT/SET NULL व्यवहार लागू होगा
- ट्रिगर: प्रत्येक डिलीट की गई पंक्ति के लिए DELETE ट्रिगर फायर होंगे
TRUNCATE vs DELETE
सभी पंक्तियाँ डिलीट करने के लिए TRUNCATE TABLE तेज़ है (लॉग नहीं करता, ऑटो-इन्क्रीमेंट रीसेट करता है), लेकिन WHERE क्लॉज़ नहीं ले सकता।