Вы бы хотели триггер до или после вставки на items
:
create trigger blacklist_matches after insert on items
for each row execute procedure check_blacklist();
Тогда функция check_blacklist
будет выглядеть примерно так:
create function check_blacklist()
returns trigger as $$
begin
insert into matches (item_id, part_no, reason)
select NEW.item_id, NEW.part_no, blacklist.reason
from blacklist
where blacklist.part_no = NEW.part_no;
return null;
end;
$$ language plpgsql;
Забавно выглядящий $$
, более или менее, является SQL-версией heredoc.
Это оборачивает проверку "есть ли в черном списке" и вставку matches
в один простой бит SQL. Переменная NEW
в триггере является ссылкой на новую строку, с которой вы работаете. Если NEW.part_no
не соответствует чему-либо в blacklist
, то SELECT ничего не выдаст и INSERT не будет выполнен.
Предположительно, у вас будет индекс на blacklist.part_no
(который в любом случае выглядит как ПК), поэтому вышеприведенное должно быть достаточно быстрым.
Документация PostgreSQL довольно хорошая и содержит целый раздел хранимых процедур и триггеров , если вам нужна ссылка.