在Postgres中创建此触发器的最有效方法是什么。
我将在下面提供一个非常简化的示例,说明我的目的,但它基于相同的概念。
考虑一下,我们已经得到了下面定义的模式:
CREATE TABLE items (
item_id int4,
part_no int4,
description text);
CREATE TABLE blacklist (
part_no int4,
reason text);
CREATE TABLE matches (
item_id int4,
part_no int4,
reason text);
然后,每次添加新项目时,我们都会检查它是否在黑名单中(比较part_no),如果是,我们在匹配表上创建一个新条目。
答案 0 :(得分:2)
您需要items
上的插入前或插入后trigger:
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;
看起来很滑稽的$$
或多或少是heredoc的SQL版本。
它包含了“它是否在黑名单”检查和matches
插入一个简单的SQL。 NEW
variable in a trigger是对您正在使用的新行的引用。如果NEW.part_no
与blacklist
中的任何内容都不匹配,那么SELECT将不会产生任何内容,并且INSERT将不会被执行。
据推测,你的blacklist.part_no
上有一个索引(无论如何看起来像PK),所以上面应该足够快。
PostgreSQL文档相当不错,如果需要参考,可以在stored procedures and triggers上有一个完整的部分。