Để tìm xem có bất kỳ hoàn toàn trùng lặp tồn tại (giống hệt nhau trên tất cả các cột), đây có lẽ là cách nhanh nhất:
SELECT EXISTS (
SELECT 1
FROM tbl t
NATURAL JOIN tbl t1
WHERE t.ctid <> t1.ctid
)
THAM GIA TỰ NHIÊN
là cách viết tắt rất thuận tiện cho trường hợp này vì (trích dẫn hướng dẫn tại đây
):
TỒN TẠI
có lẽ là nhanh nhất, vì Postgres ngừng tìm kiếm ngay khi tìm thấy bản sao đầu tiên. Vì hầu hết bạn có thể không có chỉ mục bao gồm toàn bộ hàng và bảng của bạn rất lớn, điều này sẽ giúp bạn tiết kiệm rất nhiều của thời gian.
Lưu ý rằng NULL
là không bao giờ được coi là giống với một NULL
khác . Nếu bạn có NULL
và coi chúng giống hệt nhau, bạn phải làm nhiều việc hơn.
ctid
là một cột hệ thống
có thể (ab-) được sử dụng làm khóa chính đặc biệt, nhưng không thể thay thế khóa chính thực tế do người dùng xác định về lâu dài.
Phiên bản 8.1 lỗi thời dường như không có <>
toán tử được xác định cho một ctid
. Thử truyền sang văn bản
:
SELECT EXISTS (
SELECT 1
FROM tbl t
NATURAL JOIN tbl t1
WHERE t.ctid::text <> t1.ctid::text
)