Các tùy chọn sau có thể được sử dụng để xóa các hàng trùng lặp trong SQLite.
Những ví dụ này xóa các hàng trùng lặp nhưng giữ lại một hàng. Vì vậy, nếu có ba hàng giống nhau chẳng hạn, nó sẽ xóa hai hàng trong số đó và giữ lại một hàng. Điều này thường được gọi là khử trùng bảng.
Dữ liệu Mẫu
Giả sử chúng ta có một bảng với dữ liệu sau:
SELECT * FROM Pets;
Kết quả:
PetId PetName PetType ----- ------- ------- 1 Wag Dog 1 Wag Dog 2 Scratch Cat 3 Tweet Bird 4 Bark Dog 4 Bark Dog 4 Bark Dog
Chúng ta có thể thấy rằng hai hàng đầu tiên là trùng lặp, ba hàng cuối cùng cũng vậy.
Trong trường hợp này, tất cả các cột đều trùng lặp. Không có khóa chính. PetId
cột có thể nhìn giống như nó có thể là một khóa chính, nhưng nó thực sự chứa các giá trị trùng lặp. Do đó, nó không phải là một số nhận dạng duy nhất cho mỗi hàng và nó không thể được sử dụng làm khóa chính.
Nếu có một khóa chính, nó sẽ chứa các giá trị duy nhất trên tất cả các hàng và sẽ không có bản sao.
Trong mọi trường hợp, dưới đây là hai tùy chọn để tìm và xóa các hàng trùng lặp.
Tùy chọn 1
Trước khi xóa bảng, chúng ta có thể sử dụng truy vấn sau để xem hàng / s nào sẽ bị xóa:
SELECT * FROM Pets
WHERE EXISTS (
SELECT 1 FROM Pets p2
WHERE Pets.PetName = p2.PetName
AND Pets.PetType = p2.PetType
AND Pets.rowid > p2.rowid
);
Kết quả:
PetId PetName PetType ----- ------- ------- 1 Wag Dog 4 Bark Dog 4 Bark Dog
Điều này cho chúng ta thấy rằng ba hàng sẽ bị xóa khi chúng ta xóa bảng trong bước tiếp theo.
Để xóa các giá trị trùng lặp, chúng tôi có thể sửa đổi truy vấn trên bằng cách thay thế SELECT *
với DELETE
:
DELETE FROM Pets
WHERE EXISTS (
SELECT 1 FROM Pets p2
WHERE Pets.PetName = p2.PetName
AND Pets.PetType = p2.PetType
AND Pets.rowid > p2.rowid
);
SELECT * FROM Pets;
Kết quả:
PetId PetName PetType ----- ------- ------- 1 Wag Dog 2 Scratch Cat 3 Tweet Bird 4 Bark Dog
Bảng hiện đã được gỡ bỏ.
Như mong đợi, một trong những hàng trùng lặp cho chú chó “Wag” của chúng tôi đã bị xóa và hàng còn lại vẫn còn. Hai trong số các hàng trùng lặp cho “Bark” cũng đã bị xóa.
Lý do chúng tôi có thể làm điều này là do rowid
của SQLite . Theo mặc định, mỗi hàng trong SQLite có một cột đặc biệt, thường được gọi là rowid
, xác định duy nhất hàng đó trong bảng. Trừ khi nó đã bị xóa khỏi bảng một cách rõ ràng, bạn có thể sử dụng nó làm số nhận dạng duy nhất cho mỗi hàng, điều này cho phép chúng tôi tạo các truy vấn ở trên. Điều tương tự cũng áp dụng cho ví dụ tiếp theo.
Tùy chọn 2
Giả sử bảng đã được khôi phục với dữ liệu ban đầu của nó (bao gồm cả các hàng trùng lặp), đây là một tùy chọn khác để loại bỏ lỗi.
Kiểm tra những hàng nào sẽ bị xóa:
SELECT * FROM Pets
WHERE rowid > (
SELECT MIN(rowid) FROM Pets p2
WHERE Pets.PetName = p2.PetName
AND Pets.PetType = p2.PetType
);
Kết quả:
PetId PetName PetType ----- ------- ------- 1 Wag Dog 4 Bark Dog 4 Bark Dog
Bây giờ hãy xóa các hàng đó:
DELETE FROM Pets
WHERE rowid > (
SELECT MIN(rowid) FROM Pets p2
WHERE Pets.PetName = p2.PetName
AND Pets.PetType = p2.PetType
);
SELECT * FROM Pets;
Kết quả:
PetId PetName PetType ----- ------- ------- 1 Wag Dog 2 Scratch Cat 3 Tweet Bird 4 Bark Dog
Bảng đã được gỡ bỏ.