sql - 在 PostgreSQL 中使用排序删除

标签 sql postgresql

我正在尝试按特定顺序删除行。我尝试了帖子中的建议 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/

相关文章:

mysql - SQL 同列减法

postgresql - 如何开放对部署在 okteto 上的 postgresql 的公共(public)访问?

sql - 谷歌 BigQuery : how to create a new column with SQL

sql - 如何在jsp Restful Web服务中进行连接查询?

java - postgres 表不显示默认值

sql - Heroku - 每个月的第一天更新数据库列

sql - 如何从另一个表中获取最后 2 条记录作为列

postgresql - 在事务 : truncate vs delete or upsert/merge 中包装 postgresql 命令

mysql - 如何正确查找重复项并将其删除

c# - 如何使用 Join 搜索字段?