MySQL-এ টেবিল থেকে কিছু নির্দিষ্ট সারি বাদ দিয়ে বাকি সব সারি ডিলিট করতে DELETE ... WHERE column NOT IN (...) প্যাটার্ন ব্যবহার করুন।
সিনট্যাক্স
DELETE FROM table_name
WHERE column_name NOT IN ('value1', 'value2', 'value3', ...);
উদাহরণ
CREATE TABLE delete_all_except_demo (
id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(20)
);
INSERT INTO delete_all_except_demo (name) VALUES
('Larry'), ('John'), ('Sam'), ('Mike'), ('Carol'), ('Bob'), ('David');
ডিলিট করার আগে
SELECT * FROM delete_all_except_demo;
+----+-------+
| id | name |
+----+-------+
| 1 | Larry |
| 2 | John |
| 3 | Sam |
| 4 | Mike |
| 5 | Carol |
| 6 | Bob |
| 7 | David |
+----+-------+
'John', 'Mike', 'Carol' বাদ দিয়ে বাকি ডিলিট
DELETE FROM delete_all_except_demo
WHERE name NOT IN ('John', 'Mike', 'Carol');
আউটপুট
Query OK, 4 rows affected (0.15 sec)
ফলাফল যাচাই
SELECT * FROM delete_all_except_demo;
+----+-------+
| id | name |
+----+-------+
| 2 | John |
| 4 | Mike |
| 5 | Carol |
+----+-------+
সতর্কতা ও সেরা অনুশীলন
১. NULL মান সমস্যা
-- যদি name কলামে NULL থাকে, NOT IN তে NULL মেলে না (UNKNOWN)
-- সমাধান: NULL এক্সক্লুড করুন
DELETE FROM t WHERE name NOT IN ('John', 'Mike') AND name IS NOT NULL;
২. ট্রানজ্যাকশন ব্যবহার করুন
START TRANSACTION;
DELETE FROM delete_all_except_demo WHERE name NOT IN ('John', 'Mike', 'Carol');
-- SELECT * FROM delete_all_except_demo; -- যাচাই
COMMIT; -- বা ROLLBACK;
৩. বড় টেবিলে ব্যাচ ডিলিট
DELETE FROM delete_all_except_demo
WHERE name NOT IN ('John', 'Mike', 'Carol')
LIMIT 1000; -- ১০০০ সারি প্রতি ব্যাচ
৪. ডিলিটের আগে SELECT দিয়ে প্রিভিউ
SELECT * FROM delete_all_except_demo WHERE name NOT IN ('John', 'Mike', 'Carol');
বিকল্প: LEFT JOIN + IS NULL (কম্পোজিট কি/একাধিক কলামের জন্য)
DELETE a FROM table_a a
LEFT JOIN (
SELECT 'John' AS name UNION ALL SELECT 'Mike' UNION ALL SELECT 'Carol'
) b ON a.name = b.name
WHERE b.name IS NULL;
TRUNCATE vs DELETE
TRUNCATE TABLE— সব সারি ডিলিট, অটো-ইনক্রিমেন্ট রিসেট, ফাস্ট, রোলব্যাক 안 됨DELETE WHERE ...— শর্তসাপেক্ষ, স্লো, রোলব্যাক সম্ভব, ট্রিগার ফায়ার