我是postgreSql的新手,我使用以下查询从数据库中检索所有字段。
SELECT student.*,row_number() OVER () as rnum FROM student;
我不知道如何逐行删除特定的内容。请给我一些想法。
这是我的表:
Column | Type ------------+------------------ name | text rollno | integer cgpa | double precision department | text branch | text
答案 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
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;