postgresql中逐行删除行号

Gan*_* SR 2 postgresql delete-row sql-delete

我是 postgreSql 的新手,我使用以下查询从数据库中检索所有字段。

SELECT student.*,row_number() OVER () as rnum FROM student;
Run Code Online (Sandbox Code Playgroud)

我不知道如何逐行删除特定行号。请给我一些想法。

这是我的桌子:

专栏 | 类型
----------+------------------
名称 | 文本
滚号 | 整数
平均绩点 | 双精度
部门 | 文本
分公司 | 文本

Viv*_* S. 6

with a as
(
SELECT student.*,row_number() OVER () as rnum FROM student
)

delete from student where ctid in (select ctid from a where rnum =1) -- the 
                                                                     -- row_number you want    
                                                                     -- to delete
Run Code Online (Sandbox Code Playgroud)

引自PostgreSQL - 系统列

ctid :
行版本在其表中的物理位置。请注意,虽然 ctid 可用于非常快速地定位行版本,但每次通过 VACUUM FULL 更新或移动行时,行的 ctid 都会发生变化。因此 ctid 作为长期行标识符是没有用的。应使用 OID(或者更好的是用户定义的序列号)来标识逻辑行。


注意:我强烈建议您使用学生unique档案


按照克雷格的评论,我将提供另一种方法来解决OP的问题,这有点棘手

首先为创建一个唯一,用于以下查询 student

alter table student add column stu_uniq serial
Run Code Online (Sandbox Code Playgroud)

这将为stu_uniq每一行生成相应的唯一值,以便 OP 可以轻松地使用它的DELETE任何stu_uniq

  • @GaneshkumarSR:您仍然可以在该表中包含一个“serial”列,然后在导入过程中自动填充该列(只是不为其提供值)。这将是比依赖 ctid 更好的解决方案。 (2认同)