我正在尝试按特定顺序删除行。我尝试了帖子中的建议 How do I delete a fixed number of rows with sorting in PostgreSQL? ,但没有任何效果。我知道它们不起作用,因为我有一个删除触发器并查看删除了哪个,但它从来没有按照我想要的顺序执行。
我写的测试是这样的:
create table test1 (
th text,
co text,
ty text);
CREATE OR REPLACE FUNCTION testfunc() RETURNS TRIGGER
LANGUAGE plpgsql
AS $$
DECLARE modified_row test1%ROWTYPE;
BEGIN
IF TG_OP = 'DELETE' THEN
modified_row := OLD;
ELSE
modified_row := NEW;
END IF;
raise notice 'opearation: %, co: %', TG_OP, modified_row.co;
RETURN modified_row;
END;
$$;
CREATE TRIGGER trigger_test1
BEFORE DELETE OR INSERT on test1
FOR EACH ROW
EXECUTE PROCEDURE testfunc();
insert into test1 (th, co, ty) values ('t1', 'c1', 'p'), ('t2', 'c2','p'), ('t2', 'c3','p'), ('t2', 'c4','p');
delete from test1 where ctid in (select ctid from test1 order by co desc);
上面的删除语句是上面帖子中获得最高投票和接受的答案。但对我来说,输出一直是:
注意:操作:删除,co: c1
注意:操作:DELETE,co:c2
注意:操作:DELETE,co:c3
注意:操作:DELETE,co:c4
这表明删除不是按照我尝试执行的“co”的降序顺序完成的。我在这里遗漏了什么吗?
注意:忘记插入顺序,我只关心删除顺序。我不能在上面的帖子中提出这个问题,因为我没有足够的声誉来发表评论。
最佳答案
我能想到的唯一方法是循环删除。 下面是一个使用游标的示例:
DO $$
DECLARE
test1_row test1%ROWTYPE;
DECLARE cur CURSOR FOR SELECT * FROM test1 ORDER BY co DESC FOR UPDATE;
BEGIN
FOR test1_row IN cur
LOOP
DELETE FROM test1 WHERE CURRENT OF cur;
END LOOP;
END $$
没有光标的例子:
DO $$
DECLARE
test1_row test1%ROWTYPE;
BEGIN
FOR test1_row IN SELECT * FROM test1 ORDER BY co DESC
LOOP
DELETE FROM test1 WHERE th = test1_row.th AND co = test1_row.co AND ty = test1_row.ty;
END LOOP;
END $$
注意:DELETE
语句中的WHERE
条件不可靠,因为test1
表没有主键/唯一键。在其他情况下,您可以只使用:WHERE id = row.id
关于sql - 在 PostgreSQL 中使用排序删除,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35759029/