【问题标题】:Check for complete duplicate rows in a large table检查大表中的完整重复行
【发布时间】:2013-06-11 03:19:37
【问题描述】:

可以在此处找到包含所有相关上下文的原始问题:
Adding a multi-column primary key to a table with 40 million records

我有一个包含 4000 万行且没有主键的表。在添加主键之前,我想检查表是否有任何重复条目。当我说重复条目时,我不仅仅指在特定列上重复。我的意思是整行重复。

我在上一个问题中被告知,我可以执行EXISTS 查询来确定重复项。我该怎么做?

我正在运行 PostgreSQL 8.1.22。 (通过运行select version() 获得此信息)。

【问题讨论】:

    标签: sql postgresql exists duplicates postgresql-8.1


    【解决方案1】:

    要查找是否存在 any 完全重复(在所有列上都相同),这可能是最快的方法:

    SELECT EXISTS (
        SELECT 1
        FROM   tbl t
        NATURAL JOIN tbl t1 
        WHERE  t.ctid <> t1.ctid
        )
    

    NATURAL JOIN 是一个非常方便的案例简写,因为(引用 the manual here):

    NATURALUSING 列表的简写,它提到了 两个同名的表。

    EXISTS 可能是最快的,因为 Postgres 会在找到第一个重复项后立即停止搜索。由于您很可能没有覆盖整行的索引,而且您的表格很大,这将为您节省大量时间。

    请注意,NULL从不被视为与另一个 NULL 相同。如果您有 NULL 值并认为它们相同,那么您必须做更多的事情。

    ctid is a system column 可以(ab-)用作临时主键,但从长远来看不能替换实际的用户定义的主键。


    过时的 8.1 版似乎没有为 ctid 定义 &lt;&gt; 运算符。尝试投射到text

    SELECT EXISTS (
        SELECT 1
        FROM   tbl t
        NATURAL JOIN tbl t1 
        WHERE  t.ctid::text <> t1.ctid::text
        )
    

    【讨论】:

    • 我收到一个错误:错误:运算符不存在:tid tid 提示:没有运算符与给定的名称和参数类型匹配。您可能需要添加显式类型转换。
    • @user1338584:过时版本的另一个问题。再一次:你真的需要升级..我添加了一个解决方法。
    【解决方案2】:

    这样的事情不应该做吗?

    SELECT ALL_COLUMNS[expect unique ID],
           count(0) as Dupl 
    FROM   table 
    WHERE  Dupl>1
    GROUP BY ALL_COLUMNS[expect unique ID];
    

    不确定这是否是最有效的方法,但 count>1 表示您有两个相同的行。

    【讨论】:

      猜你喜欢
      • 2011-04-01
      • 1970-01-01
      • 2023-04-10
      • 2011-06-21
      • 2014-02-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-11-30
      相关资源
      最近更新 更多