何かかどうかを確認するには 完全な重複が存在します(すべての列で同一)。これがおそらく最速の方法です:
SELECT EXISTS (
SELECT 1
FROM tbl t
NATURAL JOIN tbl t1
WHERE t.ctid <> t1.ctid
)
NATURAL JOIN
(を引用すると、このケースの非常に便利な省略形になります。こちらのマニュアル
):
EXISTS コード>
最初の重複が見つかるとすぐにPostgresが検索を停止するため、おそらく最速です。ほとんどの場合、行全体をカバーするインデックスがなく、テーブルが巨大であるため、これにより大幅に節約できます。 時間の。
NULL
に注意してください 決して 別のNULL
と同一と見なされます 。 NULL
がある場合 値を同じと見なすと、さらに多くのことを行う必要があります。
ctid
システム列です
アドホック主キーとして(ab-)使用できますが、長期的には実際のユーザー定義の主キーを置き換えることはできません。
古いバージョン8.1には<>
がないようです ctid
に対して定義された演算子 。 text
にキャストしてみてください :
SELECT EXISTS (
SELECT 1
FROM tbl t
NATURAL JOIN tbl t1
WHERE t.ctid::text <> t1.ctid::text
)