在postgresql中逐行删除

时间:2014-10-15 04:45:21

标签: postgresql delete-row sql-delete

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

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

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

这是我的表:

Column      | Type
------------+------------------
name        | text
rollno      | integer 
cgpa        | double precision 
department  | text 
branch      | text 

3 个答案:

答案 0 :(得分:2)

我不知道它是否是这个问题的正确选择。但它满足了我的问题。我的问题是什么我需要在没有任何人帮助的情况下删除一行。我用OIDS创建表,并在帮助下oid我删除了行。

CREATE TABLE Student(Name Text,RollNo Integer,Cgpa Float,Department Text,Branch Text)WITH OIDS;
 DELETE FROM STUDENT WHERE oid=18789;
 DELETE FROM STUDENT WHERE oid=18790;

引自PostgreSQL - System Columns

感谢@WingedPanther提出这个想法。

答案 1 :(得分:1)

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

引自PostgreSQL - System Columns

  

ctid:   
行表中的行版本的物理位置。注意   虽然ctid可以用来定位行版本   很快,每次更新或移动行的ctid都会发生变化   VACUUM FULL。因此,ctid作为长期行标识符是无用的。   应该使用OID,甚至更好的用户定义的序列号   识别逻辑行。


注意:强烈建议您使用 student 表中的unique字段。


根据Craig's comment,我会提供另一种方法来解决OP的问题,这有点棘手

首先为 student创建一个唯一的,以便在查询

下使用
alter table student add column stu_uniq serial

这会产生stu_uniq,每行都有相应的唯一值,因此OP可以使用此DELETE轻松stu_uniq任何

答案 2 :(得分:0)

你可以这样试试。

create table t(id int,name varchar(10));
insert into t values(1,'a'),(2,'b'),(3,'c'),(4,'d');


with cte as
(
select *,ROW_NUMBER()over(order by id) as rn from t
)
delete from cte where rn=1;

Cte in Postgres