Mysql
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Mysql

MySQL Xóa các bản ghi trùng lặp

Đôi khi bạn có thể cần loại bỏ các bản ghi trùng lặp hoặc xóa các hàng trùng lặp trong MySQL. Chủ yếu có 3 cách để xóa các bản ghi trùng lặp trong MySQL. Dưới đây là cách xóa các bản ghi trùng lặp trong MySQL.

MySQL Xóa các bản ghi trùng lặp

Dưới đây là các bước để loại bỏ các bản ghi trùng lặp trong MySQL. Giả sử bạn có bảng sau trùng lặp (id, số tiền) với các bản ghi trùng lặp.

mysql> create table dup_orders(id int, amount int);

mysql> insert into dup_orders(id,amount) values(1, 100),(1,250),(2,350),(2,350);

mysql> select * from dup_orders;
+------+--------+
| id   | amount |
+------+--------+
|    1 |    100 |
|    1 |    250 |
|    2 |    350 |
|    2 |    350 |
+------+--------+

Phần thưởng đã đọc:Cách lấy các bản ghi trùng lặp trong MySQL

Cách xóa các hàng trùng lặp trong MySQL

Hãy cùng chúng tôi xem xét từng cách trong số 3 cách để xóa các bản ghi trùng lặp trong MySQL.

1. Loại bỏ các bản ghi trùng lặp bằng bảng trung gian

Phương pháp này bao gồm 3 bước. Trước tiên, hãy chọn các hàng không có bản sao, từ conc_orders bảng và chèn chúng vào bảng khác. Đây là cú pháp của nó.

CREATE TABLE [copy_of_source] SELECT DISTINCT [columns] FROM [source_table];

Đây là truy vấn của chúng tôi để chọn các hàng riêng biệt từ conc_orders vào một bảng khác.

mysql> CREATE TABLE dup_orders_copy SELECT DISTINCT id,amount FROM dup_orders;

mysql> select * from dup_orders_copy;
+------+--------+
| id   | amount |
+------+--------+
|    1 |    100 |
|    1 |    250 |
|    2 |    350 |
+------+--------+

Truy vấn trên loại bỏ các hàng hoàn thành trùng lặp, đó là các giá trị trùng lặp cho tất cả các cột.

Nếu bạn muốn loại bỏ các hàng có giá trị trùng lặp chỉ cho một hoặc nhiều chứ không phải tất cả các cột, bạn có thể sử dụng mệnh đề GROUP BY trong truy vấn trên. Ví dụ:nếu bạn chỉ muốn các hàng có giá trị cột ID trùng lặp trong bảng của mình, hãy sử dụng truy vấn sau.

mysql> CREATE TABLE dup_orders_copy SELECT id,amount FROM dup_orders group by id;

mysql> select * from dup_orders_copy;
+------+--------+
| id   | amount |
+------+--------+
|    1 |    100 |
|    2 |    350 |
+------+--------+

Khi bạn đã tạo bảng trung gian, hãy bỏ bảng gốc.

mysql> drop table dup_orders;

Cuối cùng, đổi tên bảng trung gian thành bảng gốc.

mysql> alter table dup_orders_copy rename to dup_orders;

mysql> select * from dup_orders;
+------+--------+
| id   | amount |
+------+--------+
|    1 |    100 |
|    2 |    350 |
+------+--------+

Phần thưởng đọc:MySQL Thêm Constaint duy nhất

2. Xóa các hàng trùng lặp bằng INNER JOIN

Bạn cũng có thể loại bỏ các hàng trùng lặp bằng cách sử dụng kết hợp các câu lệnh DELETE và INNER JOIN. Tuy nhiên, trong trường hợp này, bảng của bạn cần có ít nhất một cột duy nhất (ví dụ:khóa chính). Giả sử bạn có Dup_orders sau bảng có số tiền trùng lặp giá trị nhưng id duy nhất giá trị.

mysql> insert into dup_orders(id,amount) values(1, 100),(2,250),(3,350),(4,350);

mysql> select * from dup_orders;
+------+--------+
| id   | amount |
+------+--------+
|    1 |    100 |
|    2 |    250 |
|    3 |    350 |
|    4 |    350 |
+------+--------+

Bạn có thể tham gia bảng trên với chính nó bằng cách sử dụng INNER JOIN và xóa các hàng trùng lặp bằng cách sử dụng truy vấn sau.

mysql> DELETE t1 FROM dup_orders t1
       INNER JOIN dup_orders t2
       WHERE
           t1.id < t2.id 
           AND t1.amount = t2.amount;
+------+--------+
| id   | amount |
+------+--------+
|    1 |    100 |
|    2 |    250 |
|    4 |    350 |
+------+--------+

Truy vấn trên sẽ giữ lại id cao nhất của hàng cho mỗi hàng trùng lặp. Nếu bạn muốn giữ lại hàng có id thấp nhất, hãy sử dụng truy vấn sau.

mysql> DELETE t1 FROM dup_orders t1
       INNER JOIN dup_orders t2
       WHERE
           t1.id >> t2.id 
           AND t1.amount = t2.amount;

Phần thưởng Đọc:Cột Đổi tên MySQL

3. Xóa các bản ghi trùng lặp bằng ROW_NUMBER ()

Bạn cũng có thể xóa các bản ghi trùng lặp khỏi bảng bằng cách sử dụng hàm ROW_NUMBER (), khả dụng kể từ 8.0.2. Đây là truy vấn SQL để lấy số hàng của các hàng trùng lặp

SELECT *. ROW_NUMBER () Over (PARTITION BY [column] 
ORDER BY [column]) as [row_number_name];

Đây là truy vấn để lấy số hàng cho bảng lặp lại

SELECT *. ROW_NUMBER () Over (PARTITION BY id ORDER BY id) 
as row_number from dup_orders;

Chúng tôi sẽ sử dụng điều này làm truy vấn phụ trong truy vấn SQL của chúng tôi để xóa các hàng trùng lặp, như được hiển thị bên dưới

DELETE FROM dup_orders
WHERE id IN (
    SELECT id
    FROM (
        SELECT 
            id, 
            ROW_NUMBER () Over (PARTITION BY id ORDER BY id) as row_number 
           from dup_orders
    ) t
    WHERE row_number > 1
)

Hy vọng rằng bây giờ bạn có thể dễ dàng loại bỏ các bản ghi trùng lặp trong MySQL.

Ubiq giúp dễ dàng trực quan hóa dữ liệu trong vài phút và theo dõi trong trang tổng quan thời gian thực. Thử nó ngay hôm nay!

  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. MySQL - Hàng đến cột

  2. thêm cột vào bảng mysql nếu nó không tồn tại

  3. Sự khác biệt giữa THAM GIA BÊN TRONG, THAM GIA TRÁI, THAM GIA PHẢI và THAM GIA ĐẦY ĐỦ?

  4. Có phải đóng các kết nối SQL được mở bằng PDO trong PHP không

  5. Lỗi nghiêm trọng:Lỗi không xác định:Gọi đến hàm không xác định mysql_connect ()