DELETE ... WHERE column NOT IN (values) से विशिष्ट पंक्तियां रखकर बाकी हटाना
कुछ मानों को संरक्षित करते हुए बाकी सभी पंक्तियों को हटाने के लिए NOT IN क्लॉज उपयोग करें।
सिंटैक्स
DELETE FROM yourTableName
WHERE yourColumnName NOT IN ('value1', 'value2', 'value3', ...);
उदाहरण
CREATE TABLE deleteAllRowsWithCondition (
Id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
Name VARCHAR(20)
);
INSERT INTO deleteAllRowsWithCondition (Name) VALUES
('Larry'), ('John'), ('Sam'), ('Mike'), ('Carol'), ('Bob'), ('David');
डिलीट क्वेरी: John, Mike, Carol रखें
DELETE FROM deleteAllRowsWithCondition
WHERE Name NOT IN ('John', 'Mike', 'Carol');
परिणाम
Query OK, 4 rows affected (0.15 sec)
सत्यापन
SELECT * FROM deleteAllRowsWithCondition;
+----+-------+ | Id | Name | +----+-------+ | 2 | John | | 4 | Mike | | 5 | Carol | +----+-------+
महत्वपूर्ण सावधानियां
- NULL मान: यदि कॉलम में
NULLहै, तोNOT IN (..., NULL)कभी मेल नहीं खाता (परिणामUNKNOWN)। समाधान:WHERE (Name NOT IN (...) OR Name IS NULL)याNOT EXISTSउपयोग करें। - बड़े टेबल: चरणों में हटाएं (
LIMIT 1000के साथ लूप) लॉक एस्केलेशन और रेप्लिकेशन लैग से बचने के लिए। - ट्रांजैक्शन:
START TRANSACTION; DELETE ...; -- जांचें; COMMIT/ROLLBACK; - विदेशी कुंजी: रेफरेंस करने वाली टेबल पर
ON DELETE CASCADEयाRESTRICTव्यवहार जांचें।
वैकल्पिक: NOT EXISTS (NULL-सुरक्षित)
DELETE FROM deleteAllRowsWithCondition d
WHERE NOT EXISTS (
SELECT 1 FROM (SELECT 'John' AS n UNION SELECT 'Mike' UNION SELECT 'Carol') keep
WHERE keep.n = d.Name
);