Ví dụ sau đây xóa các hàng trùng lặp trong MySQL trong khi bỏ qua khóa chính hoặc cột định danh duy nhất.
Ví dụ xóa các hàng trùng lặp nhưng giữ lại một hàng. Vì vậy, trong trường hợp hai hàng giống nhau, nó sẽ xóa một trong số chúng và giữ lại hàng kia.
Dữ liệu mẫu
Giả sử chúng ta có một bảng với dữ liệu sau:
SELECT * FROM Dogs;
Kết quả:
+---------+-------------+------------+ | DogId | FirstName | LastName | |---------+-------------+------------| | 1 | Bark | Smith | | 2 | Bark | Smith | | 3 | Woof | Jones | | 4 | Ruff | Robinson | | 5 | Wag | Johnson | | 6 | Wag | Johnson | | 7 | Wag | Johnson | +---------+-------------+------------+
Chúng ta có thể thấy rằng hai hàng đầu tiên là trùng lặp và ba hàng cuối cùng là trùng lặp.
Tìm bản sao
Trước tiên, hãy chọn kiểm tra bảng của chúng tôi để xem có bao nhiêu hàng trùng lặp:
SELECT
FirstName,
LastName,
COUNT(*) AS Count
FROM Dogs
GROUP BY FirstName, LastName
HAVING COUNT(*) > 1;
Kết quả:
+-----------+----------+-------+ | FirstName | LastName | Count | +-----------+----------+-------+ | Bark | Smith | 2 | | Wag | Johnson | 3 | +-----------+----------+-------+
Chúng ta có thể thấy rằng có hai hàng với Bark Smith và ba hàng với Wag Johnson.
Chúng tôi sẽ tách bảng để nó chỉ chứa một trong số mỗi bảng.
Xóa các bản sao
Chạy đoạn mã sau để xóa bảng trên:
DELETE d1 FROM Dogs d1
INNER JOIN Dogs d2
WHERE
d1.DogId < d2.DogId AND
d1.FirstName = d2.FirstName AND
d1.LastName = d2.LastName;
Kết quả:
Query OK, 3 rows affected (0.00 sec)
Hãy xem kết quả:
SELECT * FROM Dogs;
Kết quả:
+-------+-----------+----------+ | DogId | FirstName | LastName | +-------+-----------+----------+ | 2 | Bark | Smith | | 3 | Woof | Jones | | 4 | Ruff | Robinson | | 7 | Wag | Johnson | +-------+-----------+----------+
Chúng tôi đã xóa thành công các hàng trùng lặp khỏi bảng.