การลบ Duplicate Rows ใน MySQL โดยเก็บไว้ 1 แถว
ใช้ DELETE แบบ Self-Join เปรียบเทียบคอลัมน์ที่ซ้ำกัน และลบแถวที่มี ID มากกว่า (เก็บแถวแรก/ID น้อยสุด)
ตัวอย่างการใช้งาน
สร้างตารางและเพิ่มข้อมูลซ้ำ (Carol ซ้ำ 3 ครั้ง):
mysql> create table DemoTable (StudentId int NOT NULL AUTO_INCREMENT PRIMARY KEY, StudentName varchar(40));
mysql> insert into DemoTable(StudentName) values('John');
mysql> insert into DemoTable(StudentName) values('Carol');
mysql> insert into DemoTable(StudentName) values('Sam');
mysql> insert into DemoTable(StudentName) values('Carol');
mysql> insert into DemoTable(StudentName) values('David');
mysql> insert into DemoTable(StudentName) values('Carol');
ข้อมูลก่อนลบ (6 แถว):
+-----------+-------------+ | StudentId | StudentName | +-----------+-------------+ | 1 | John | | 2 | Carol | | 3 | Sam | | 4 | Carol | | 5 | David | | 6 | Carol | +-----------+-------------+
คิวรีลบซ้ำ (เก็บ StudentId น้อยสุดของแต่ละชื่อ):
mysql> delete tbl1 from DemoTable tbl1, DemoTable tbl2
WHERE tbl1.StudentName = tbl2.StudentName
AND tbl1.StudentId > tbl2.StudentId;
Query OK, 2 rows affected (0.79 sec)
ข้อมูลหลังลบ (เหลือ 4 แถว):
+-----------+-------------+ | StudentId | StudentName | +-----------+-------------+ | 1 | John | | 2 | Carol | | 3 | Sam | | 5 | David | +-----------+-------------+
วิธีอื่น (MySQL 8.0+ CTE + ROW_NUMBER):
WITH cte AS (
SELECT StudentId, ROW_NUMBER() OVER (PARTITION BY StudentName ORDER BY StudentId) AS rn
FROM DemoTable
)
DELETE FROM DemoTable WHERE StudentId IN (SELECT StudentId FROM cte WHERE rn > 1);
ป้องกันล่วงหน้า: ใส่ UNIQUE INDEX บนคอลัมน์ที่ห้ามซ้ำ