Я разрешаю пользователям сортировать по количеству ответов и индексировать их, чтобы операция была быстрой. Я поддерживаю количество ответов на сообщения со следующим SQL (также существует эквивалентный набор из двух функций для увеличивающейся половины):
CREATE TRIGGER post_reply_count_decrement_update
BEFORE DELETE ON
public.convo_reply for each row execute function trigger_function_decrement_reply_count();
-
CREATE OR REPLACE FUNCTION public.trigger_function_decrement_reply_count()
RETURNS trigger
LANGUAGE plpgsql
AS $function$
BEGIN
UPDATE post SET reply_count = reply_count - 1 WHERE post.convo_id = OLD.convo_id;
RETURN OLD;
END;
$function$;
Я сейчас пытаюсь запустить эту команду: DELETE FROM convo WHERE convo_id = 1000031;
К сожалению, она не работает и выдает мне эту ошибку:
SQL Error [23503]: ERROR: insert or update on table "post" violates foreign key constraint
"post_convo_id_fk"
Detail: Key (convo_id)=(1000031) is not present in table "convo".
Where: SQL statement "UPDATE post SET reply_count = reply_count - 1 WHERE post.convo_id = OLD.convo_id"
PL/pgSQL function trigger_function_decrement_reply_count() line 3 at SQL statement
SQL statement "DELETE FROM ONLY "public"."convo_reply" WHERE $1 OPERATOR(pg_catalog.=) "convo_id""
Я считаю, что это происходит, потому что запись convo
удаляется, а затем в триггере возвращается значение NULL, поэтому триггер выдает ошибки.
Однако это не проблема, так как счетчик ответов в любом случае будет установлен на 0 через мгновение после сообщение удалено Возможно, есть способ как-то просто отключить триггер, пока он работает? (хотя я все еще хочу, чтобы он работал для других сообщений, конечно)
Я также хотел бы поддерживать триггер достаточно быстрым, потому что он запускается каждый раз, когда создается или уничтожается ответ.