Untuk mengetahui apakah ada duplikat penuh ada (identik di semua kolom), ini mungkin cara tercepat:
SELECT EXISTS (
SELECT 1
FROM tbl t
NATURAL JOIN tbl t1
WHERE t.ctid <> t1.ctid
)
NATURAL JOIN
adalah singkatan yang sangat nyaman untuk kasus ini karena (mengutip manualnya di sini
):
EXISTS
mungkin tercepat, karena Postgres berhenti mencari segera setelah duplikat pertama ditemukan. Karena kemungkinan besar Anda tidak memiliki indeks yang mencakup seluruh baris dan tabel Anda sangat besar, ini akan menghemat banyak waktu.
Ketahuilah bahwa NULL
adalah tidak pernah dianggap identik dengan NULL
lainnya . Jika Anda memiliki NULL
nilai dan menganggapnya identik, Anda harus berbuat lebih banyak.
ctid
adalah kolom sistem
yang dapat (ab-)digunakan sebagai kunci utama ad-hoc, tetapi tidak dapat menggantikan kunci utama yang ditentukan pengguna dalam jangka panjang.
Versi 8.1 yang sudah ketinggalan zaman tampaknya tidak memiliki <>
operator yang ditentukan untuk ctid
. Coba transmisikan ke text
:
SELECT EXISTS (
SELECT 1
FROM tbl t
NATURAL JOIN tbl t1
WHERE t.ctid::text <> t1.ctid::text
)