如何在 DELETE 语句中使用行的物理位置 (ROWID)

end*_*ini 4 sql database postgresql rowid

我有一个表有很多重复的行并且没有主键。
我只想删除重复的记录,但是当我尝试这样做时,它会删除所有对等点。

如何ROWID从 Postgres 的表中找到?

end*_*ini 5

在 PostgreSQL 上,行的物理位置称为 CTID。

因此,如果您想查看它,请使用这样的 QUERY:

SELECT CTID FROM table_name
Run Code Online (Sandbox Code Playgroud)

要在 DELETE 语句上使用它来删除重复的记录,请像这样使用它:

DELETE FROM table_name WHERE CTID NOT IN (
  SELECT RECID FROM 
    (SELECT MIN(CTID) AS RECID, other_columns 
      FROM table_name GROUP BY other_columns) 
  a);
Run Code Online (Sandbox Code Playgroud)

请记住 table_name 是所需的表,other_columns 是您要用来过滤它的列。

IE:

DELETE FROM user_department WHERE CTID NOT IN (
  SELECT RECID FROM 
    (SELECT MIN(CTID) AS RECID, ud.user_id, ud.department_id
      FROM user_department ud GROUP BY ud.user_id, ud.department_id) 
  a);
Run Code Online (Sandbox Code Playgroud)


Erw*_*ter 5

将其简化为一个查询级别:

DELETE FROM table_name
WHERE  ctid NOT IN (
   SELECT min(ctid)
   FROM   table_name
   GROUP  BY $other_columns);
Run Code Online (Sandbox Code Playgroud)

.. 其中重复项由$other_columns.
不需要GROUP BYSELECT列表中包含子句中的列,因此您不需要另一个子查询。

ctid 在当前手册中。