如何删除postgres中的重复项(无唯一ID)

no_*_*ame 1 postgresql uniqueidentifier duplicates

我在删除重复行时遇到了一些困难。我认为 user_id 和 time_id 一起充当标识符,但它们甚至是重复的。

user_id(文本)、time_id(bigint)、value1(数字)

user_id; time_id; value1| 
aaa;1;3|
aaa;1;3|
aaa;2;4|
baa;3;1|
Run Code Online (Sandbox Code Playgroud)

在这种情况下,如何删除重复项?因为我在 time_id 中有 16 个不同的值,在 user_id 中有 15,000 个不同的值,所以我尝试了这样的事情,但我没有唯一的 id..

    DELETE FROM tablename a
     USING tablename b
    WHERE a.unique_id < b.unique_id
    AND   a.user_id = b.user_id
    time_id = 1       (repeat till time_id 16)
Run Code Online (Sandbox Code Playgroud)

kli*_*lin 5

Postgres 中的每个表都有一些隐藏的系统列。其中之一(ctid)根据定义是唯一的,可以在缺少主键的情况下使用。

DELETE FROM tablename a
USING tablename b
WHERE a.ctid < b.ctid
AND a.user_id = b.user_id
AND a.time_id = b.time_id;
Run Code Online (Sandbox Code Playgroud)

问题是由于缺少主键。使用隐藏列不应该是一个系统的方法(见下面的评论)。删除重复项后,您应该(user_id, time_id)为此目的创建主键或创建新的唯一列。

  • 我的提示显然是随意的,表当然应该有一个主键。我记得你给过[过去类似的建议。](/sf/answers/1563798841/) (2认同)