কম্পিউটার টিউটোরিয়াল

MySQL-এ NOT IN ব্যবহার করে নির্দিষ্ট সারি বাদ দিয়ে বাকি সব ডিলিট করা

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 ... — শর্তসাপেক্ষ, স্লো, রোলব্যাক সম্ভব, ট্রিগার ফায়ার
  1. MySQL-এ DELETE এবং INTERVAL ব্যবহার করে ৩০ দিন পুরনো রেকর্ড মুছে ফেলা

  2. MySQL-এ আজকের তারিখ বাদ দিয়ে বাকি সব রেকর্ড নির্বাচন

  3. একক MySQL কোয়ারিতে একাধিক সারি পাওয়ার পদ্ধতি

  4. MySQL-এ LIKE অপারেটর দিয়ে একাধিক সারি বের করা