Как каскадно удалять ответы из поста при удалении поста? - PullRequest
0 голосов
/ 20 января 2020

Я разрешаю пользователям сортировать по количеству ответов и индексировать их, чтобы операция была быстрой. Я поддерживаю количество ответов на сообщения со следующим 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 через мгновение после сообщение удалено Возможно, есть способ как-то просто отключить триггер, пока он работает? (хотя я все еще хочу, чтобы он работал для других сообщений, конечно)

Я также хотел бы поддерживать триггер достаточно быстрым, потому что он запускается каждый раз, когда создается или уничтожается ответ.

1 Ответ

0 голосов
/ 20 января 2020

Вы можете попробовать отключить указанный триггер c перед запуском запроса

ALTER TABLE public.convo_reply DISABLE TRIGGER post_reply_count_decrement_update;

или отловить нарушение

EXCEPTION WHEN others THEN
....

или проверить, существует ли сообщение, изменить общий лог c , Запустите триггер для таблицы записей, например, измените таблицу, в которой создан ваш индекс ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...