MySQL में ORDER BY और LIMIT के साथ विशिष्ट पंक्तियाँ हटाना
MySQL DELETE स्टेटमेंट में ORDER BY और LIMIT क्लॉज का समर्थन करता है, जिससे आप एक विशिष्ट क्रम में केवल पहली N पंक्तियों को हटा सकते हैं। यह पुराने रिकॉर्ड्स को संग्रहीत करने, डुप्लिकेट हटाने, या नमूना डेटा हटाने के लिए उपयोगी है।
टेबल बनाना
mysql> CREATE TABLE DemoTable (
-> Id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
-> FirstName VARCHAR(20)
-> );
Query OK, 0 rows affected (0.65 sec)
डेटा डालना
mysql> INSERT INTO DemoTable(FirstName) VALUES ('Chris');
Query OK, 1 row affected (0.12 sec)
mysql> INSERT INTO DemoTable(FirstName) VALUES ('Adam');
Query OK, 1 row affected (0.11 sec)
mysql> INSERT INTO DemoTable(FirstName) VALUES ('John');
Query OK, 1 row affected (0.11 sec)
mysql> INSERT INTO DemoTable(FirstName) VALUES ('David');
Query OK, 1 row affected (0.12 sec)
mysql> INSERT INTO DemoTable(FirstName) VALUES ('Mike');
Query OK, 1 row affected (0.19 sec)
mysql> INSERT INTO DemoTable(FirstName) VALUES ('Carol');
Query OK, 1 row affected (0.17 sec)
mysql> INSERT INTO DemoTable(FirstName) VALUES ('Sam');
Query OK, 1 row affected (0.13 sec)
हटाने से पहले सभी रिकॉर्ड्स
mysql> SELECT * FROM DemoTable;
+----+-----------+
| Id | FirstName |
+----+-----------+
| 1 | Chris |
| 2 | Adam |
| 3 | John |
| 4 | David |
| 5 | Mike |
| 6 | Carol |
| 7 | Sam |
+----+-----------+
7 rows in set (0.00 sec)
वर्णानुक्रम में पहली 4 पंक्तियाँ हटाना
mysql> DELETE FROM DemoTable
-> ORDER BY FirstName ASC
-> LIMIT 4;
Query OK, 4 rows affected (0.19 sec)
हटाने के बाद शेष रिकॉर्ड्स
mysql> SELECT * FROM DemoTable;
+----+-----------+
| Id | FirstName |
+----+-----------+
| 3 | John |
| 5 | Mike |
| 7 | Sam |
+----+-----------+
3 rows in set (0.00 sec)
क्या हुआ?
- ORDER BY FirstName ASC: नाम के अनुसार वर्णानुक्रम में क्रमबद्ध: Adam, Carol, Chris, David, John, Mike, Sam
- LIMIT 4: पहली 4 पंक्तियाँ लेता है: Adam (Id=2), Carol (Id=6), Chris (Id=1), David (Id=4)
- DELETE: ये 4 पंक्तियाँ हटा दी जाती हैं
- शेष: John (3), Mike (5), Sam (7)
महत्वपूर्ण विचार
- LIMIT के बिना ORDER BY DELETE खतरनाक है - यह सभी पंक्तियाँ हटा देगा
- लेनदेन का उपयोग करें महत्वपूर्ण डेटा के लिए:
START TRANSACTION; DELETE ...; COMMIT; - पहले SELECT के साथ सत्यापित करें:
SELECT * FROM DemoTable ORDER BY FirstName ASC LIMIT 4; - बहु-टेबल DELETE ORDER BY LIMIT का समर्थन नहीं करता
आम उपयोग मामले
सबसे पुराने N रिकॉर्ड्स हटाएं (लॉग रोटेशन)
DELETE FROM Logs
ORDER BY CreatedAt ASC
LIMIT 1000;
डुप्लिकेट रखते हुए पहली घटना हटाएं
DELETE t1 FROM DemoTable t1
INNER JOIN DemoTable t2
WHERE t1.Id > t2.Id AND t1.Email = t2.Email
ORDER BY t1.Id ASC
LIMIT 10;
यादृच्छिक नमूना हटाएं
DELETE FROM DemoTable
ORDER BY RAND()
LIMIT 100;
चेतावनी: प्रतिकृति और बाइनरी लॉगिंग
DELETE ... ORDER BY ... LIMIT स्टेटमेंट-आधारित प्रतिकृति के साथ असुरक्षित है क्योंकि क्रम रेप्लिका पर भिन्न हो सकता है। पंक्ति-आधारित प्रतिकृति का उपयोग करें या कथन को निर्धारक बनाएं।