Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> MySQL

ลบเรคคอร์ดซ้ำเก็บไว้แค่ 1 แถวใน MySQL

การลบ 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 บนคอลัมน์ที่ห้ามซ้ำ