2016-03-02 3 views
1

Я пытаюсь удалить строки в определенном порядке. Я пробовал предложения в сообщении How do I delete a fixed number of rows with sorting in PostgreSQL?, но ничего не получилось. Я знаю, что они не работали, потому что у меня был триггер при удалении и видя, какой из них удален, и он никогда не делает этого в том порядке, в котором я его хочу.Удалить с сортировкой в ​​PostgresSQL

Тесты, которые я написал, как это:

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); 

Функция удаления выше утверждение является набравших наибольшее количество голосов и принял ответ в посте выше. Но для меня, выход всегда был:

ВНИМАНИЕ: opearation: DELETE, совместно: c1

ВНИМАНИЕ: opearation: DELETE, совместно: c2

ВНИМАНИЕ: opearation: DELETE, совместно: c3

ВНИМАНИЕ: opearation: DELETE, совместно: c4

, который указывает на то, что удалений не выполняются в порядке по убыванию «со», что я пытаюсь сделать. Я что-то упустил?

ПРИМЕЧАНИЕ: забудьте о порядке вставки, меня беспокоит только порядок удаления. И я не мог задать этот вопрос в вышеупомянутом сообщении, потому что у меня нет достаточной репутации, чтобы оставить комментарий.

+1

Вы можете создать 'CURSOR' и удалить один за другим? –

+0

Если вы используете LIMIT 1 в своем подселекте delete, вы сначала удалите последний. Если вы сделаете это в цикле, вы получите заказ, который вы пожелаете. – hruske

+0

хорошо, я попробую те. Но нет способа сортировать удаления? – ski

ответ

2

Единственный способ, о котором я могу думать, это удалить в цикле. Вот пример использования курсора:

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 $$ 

Замечание: при WHERE условие DELETE выше высказывании не является надежным, так как test1 таблица не имеет первичного/уникальный ключ. В других случаях вы можете просто использовать: WHERE id = row.id

+0

Спасибо pumbo, отлично работает. – ski

Смежные вопросы