У меня есть таблица с автоматически увеличенным идентификатором, и я создал триггер для реорганизации идентификатора при удалении кортежа. Но я не знаю почему, я получаю исключение первичного ключа при выполнении триггера, и, как я уже пробовал, это потому, что триггер выполняется перед удалением.
Вот мой код:
DROP FUNCTION IF EXISTS f_trig_deleteEvent();
CREATE OR REPLACE FUNCTION f_trig_deleteEvent() RETURNS TRIGGER as
$$
DECLARE
nb int;
DECLARE ev evenement%rowType;
BEGIN
select 1 into nb;
FOR ev in select *
from evenement
where valeur_module LIKE OLD.valeur_module
and date_seance LIKE OLD.date_seance
and id_user LIKE OLD.id_user
and type_seance LIKE OLD.type_seance
and groupe LIKE OLD.groupe
ORDER BY id_event
LOOP
PERFORM *
from evenement
where id_event = nb
and valeur_module LIKE ev.valeur_module
and date_seance LIKE ev.date_seance
and id_user LIKE ev.id_user
and type_seance LIKE ev.type_seance
and groupe LIKE ev.groupe;
IF NOT FOUND THEN
UPDATE evenement
set id_event = nb
where valeur_module LIKE ev.valeur_module
and date_seance LIKE ev.date_seance
and id_user LIKE ev.id_user
and type_seance LIKE ev.type_seance
and groupe LIKE ev.groupe;
RAISE NOTICE '% %', ev.id_event, nb;
END IF;
select nb + 1 into nb;
end loop;
RETURN OLD;
END
$$ language plpgsql;
DROP TRIGGER IF EXISTS trig_deleteEvent on evenement;
CREATE TRIGGER trig_deleteEvent
AFTER DELETE
on evenement
FOR EACH row
EXECUTE PROCEDURE f_trig_deleteEvent();
И вот ошибка:
delete from evenement where id_event = 4;
ERROR: duplicate key value violates unique constraint "evenement_pkey"
DETAIL: Key (id_event, valeur_module, date_seance, id_user, type_seance, groupe)=(4, M1102, 2020-01-07, dufloh, TP, F) already exists.
CONTEXT: SQL statement "UPDATE evenement
set id_event = nb
where valeur_module LIKE ev.valeur_module
and date_seance LIKE ev.date_seance
and id_user LIKE ev.id_user
and type_seance LIKE ev.type_seance
and groupe LIKE ev.groupe"
PL/pgSQL function f_trig_deleteevent() line 22 at SQL statement
И когда я комментирую инструкцию UPDATE:
delete from evenement where id_event = 4;
NOTICE: 5 4
DELETE 1
Итак, мы видим, что удаление выполняется после триггер, даже если он установлен на ПОСЛЕ УДАЛЕНИЯ.
Может кто-нибудь помочь?