Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> MySQL

Tìm bản ghi trùng lặp theo khóa tổ hợp (composite key) trong MySQL

Để phát hiện các hàng trùng lặp dựa trên **kết hợp nhiều cột** (khóa tổ hợp), hãy dùng GROUP BY trên nhóm cột đó và HAVING COUNT(*) >= 2.

Cú pháp

SELECT cot_1, cot_2, ..., COUNT(*) AS so_luong
FROM ten_bang
GROUP BY cot_1, cot_2, ...
HAVING COUNT(*) >= 2;

Ví dụ minh họa

Tạo bảng giao hàng với ngày và quốc gia:

mysql> CREATE TABLE DemoTable1494 (
    -> ShippingDate DATETIME,
    -> CustomerCountryName VARCHAR(20)
    -> );

Chèn dữ liệu (có trùng lặp theo cặp Ngày+Quốc gia):

mysql> INSERT INTO DemoTable1494 VALUES
    -> ('2018-09-10 12:34:50', 'US'),
    -> ('2019-09-10 12:34:50', 'AUS'),
    -> ('2018-09-10 11:00:00', 'US'),
    -> ('2017-12-31 01:10:40', 'UK'),
    -> ('2019-09-10 05:00:50', 'AUS');

Truy vấn tìm cặp (Ngày, Quốc gia) xuất hiện ≥ 2 lần (nhóm theo phần ngày của ShippingDate):

mysql> SELECT ShippingDate, CustomerCountryName, COUNT(*) AS c
    -> FROM DemoTable1494
    -> GROUP BY DATE(ShippingDate), CustomerCountryName
    -> HAVING c >= 2
    -> ORDER BY c;

Kết quả:

+---------------------+---------------------+---+
| ShippingDate        | CustomerCountryName | c |
+---------------------+---------------------+---+
| 2018-09-10 12:34:50 | US                  | 2 |
| 2019-09-10 12:34:50 | AUS                 | 2 |
+---------------------+---------------------+---+

Giải thích

  • GROUP BY DATE(ShippingDate), CustomerCountryName: gom nhóm theo **ngày** (bỏ giờ) và quốc gia.
  • HAVING c >= 2: chỉ giữ nhóm có từ 2 bản ghi trở lên.
  • Kết quả hiển thị một hàng đại diện cho mỗi nhóm trùng lặp (giá trị ShippingDate lấy hàng đầu trong nhóm).

Mở rộng

  • Để xem **tất cả các hàng** thuộc nhóm trùng lặp, dùng window function (MySQL 8.0+):
    SELECT * FROM (SELECT *, COUNT(*) OVER (PARTITION BY DATE(ShippingDate), CustomerCountryName) AS cnt FROM DemoTable1494) t WHERE cnt >= 2;
  • Tạo unique index trên (DATE(ShippingDate), CustomerCountryName) để ngăn chặn trùng lặp ở cấp schema.