Nói chung, cách tốt nhất là đặt các ràng buộc duy nhất trên bảng để ngăn các hàng trùng lặp. Tuy nhiên, bạn có thể thấy mình đang làm việc với cơ sở dữ liệu nơi các hàng trùng lặp đã được tạo do lỗi của con người, lỗi trong ứng dụng của bạn hoặc dữ liệu chưa được làm sạch từ các nguồn bên ngoài. Hướng dẫn này sẽ dạy bạn cách tìm các hàng trùng lặp này.
Để làm theo, bạn sẽ cần quyền truy cập đọc vào cơ sở dữ liệu của mình và một công cụ để truy vấn cơ sở dữ liệu của bạn.
Xác định Tiêu chí Trùng lặp
Bước đầu tiên là xác định tiêu chí của bạn cho một hàng trùng lặp. Bạn cần sự kết hợp của hai cột để trở thành duy nhất với nhau hay bạn chỉ đơn giản là tìm kiếm các bản sao trong một cột duy nhất? Trong ví dụ này, chúng tôi đang tìm kiếm các bản sao trên hai cột trong bảng Người dùng của chúng tôi:tên người dùng và email.
Viết Truy vấn để Xác minh Tồn tại Trùng lặp
Truy vấn đầu tiên chúng ta sẽ viết là một truy vấn đơn giản để xác minh xem các bản sao có thực sự tồn tại trong bảng hay không. Đối với ví dụ của chúng tôi, truy vấn của tôi trông giống như sau:
SELECT username, email, COUNT(*)
FROM users
GROUP BY username, email
HAVING COUNT(*) > 1
HAVING
ở đây là quan trọng vì không giống như WHERE
, HAVING
bộ lọc trên các chức năng tổng hợp.
Nếu bất kỳ hàng nào được trả về, điều đó có nghĩa là chúng tôi có các bản sao. Trong ví dụ này, kết quả của chúng tôi trông như thế này:
tên người dùng | số lượng | |
---|---|---|
Pete | [email protected] | 2 |
Jessica | [email protected] | 2 |
Dặm | [email protected] | 2 |
Liệt kê tất cả các hàng có chứa trùng lặp
Trong bước trước, truy vấn của chúng tôi trả về một danh sách các bản sao. Bây giờ, chúng tôi muốn trả lại toàn bộ bản ghi cho mỗi hàng trùng lặp.
Để thực hiện điều này, chúng tôi sẽ cần chọn toàn bộ bảng và nối bảng đó với các hàng trùng lặp của chúng tôi. Truy vấn của chúng tôi trông giống như sau:
SELECT a.*
FROM users a
JOIN (SELECT username, email, COUNT(*)
FROM users
GROUP BY username, email
HAVING count(*) > 1 ) b
ON a.username = b.username
AND a.email = b.email
ORDER BY a.email
Nếu quan sát kỹ, bạn sẽ thấy rằng truy vấn này không quá phức tạp. SELECT
ban đầu chỉ cần chọn mọi cột trong bảng người dùng, sau đó kết hợp bên trong nó với bảng dữ liệu được sao chép từ truy vấn ban đầu của chúng tôi. Vì chúng tôi đang tham gia bảng với chính nó, nên cần phải sử dụng bí danh (ở đây, chúng tôi đang sử dụng a và b) để gắn nhãn hai phiên bản.
Đây là kết quả của chúng tôi trông như thế nào cho truy vấn này:
id | tên người dùng | |
---|---|---|
1 | Pete | [email protected] |
6 | Pete | [email protected] |
12 | Jessica | [email protected] |
13 | Jessica | [email protected] |
2 | Dặm | [email protected] |
9 | Dặm | [email protected] |
Vì tập hợp kết quả này bao gồm tất cả id hàng, chúng tôi có thể sử dụng nó để giúp loại bỏ trùng lặp các hàng sau này.