Đô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!