За да откриете дали иманякои съществува пълен дубликат (идентичен във всички колони), това е може би най-бързият начин:
SELECT EXISTS (
SELECT 1
FROM tbl t
NATURAL JOIN tbl t1
WHERE t.ctid <> t1.ctid
)
ЕСТЕСТВЕНО СЪЕДИНЯВАНЕ
е много удобна стенограма за случая, защото (цитирайки ръководството тук
):
СЪЩЕСТВУВАкод>
вероятно е най-бързият, защото Postgres спира търсенето веднага щом бъде намерен първият дубликат. Тъй като най-вероятно нямате индекс, покриващ целия ред и таблицата ви е огромна, това ще ви спести много на времето.
Имайте предвид, че NULL
е никога смятан за идентичен на друг NULL
. Ако имате NULL
стойности и ги считате за идентични, ще трябва да направите повече.
ctid
е системна колона
който може да бъде (зло)използван като ad-hoc първичен ключ, но не може да замени действително дефиниран от потребителя първичен ключ в дългосрочен план.
Остарялата версия 8.1 изглежда няма <>
оператор, дефиниран за ctid
. Опитайте да прехвърлите към текст
:
SELECT EXISTS (
SELECT 1
FROM tbl t
NATURAL JOIN tbl t1
WHERE t.ctid::text <> t1.ctid::text
)