要了解是否 完整存在重复(在所有列相同),这可能是最快的方法:
SELECT EXISTS (
SELECT 1
FROM tbl t
NATURAL JOIN tbl t1
WHERE t.ctid <> t1.ctid
)
NATURAL JOIN
这是一种非常方便的简写方式,因为(在此引用手册):
NATURAL
是USING
表示两个表中具有相同名称的所有列的列表的简写。
可能最快,因为一旦发现第一个重复项,Postgres就会停止搜索。由于您很可能没有索引覆盖整个行并且表很大,因此可以节省 大量 时间。
是知道 的 永远不会 认为等同于另一个NULL
。如果您拥有NULL
价值观并认为它们是相同的,那么您就必须做更多的事情。
ctid
是一个系统列,可以(用作)即席主键,但从长远来看,它不能替代实际的用户定义的主键。
过时的版本8.1似乎没有<>
为定义运算符ctid
。尝试投射到text
:
SELECT EXISTS (
SELECT 1
FROM tbl t
NATURAL JOIN tbl t1
WHERE t.ctid::text <> t1.ctid::text
)