在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),如果是,就在matches表上创建一个新条目。
发布于 2011-07-27 12:59:40
您可能需要在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;这个看起来很滑稽的$$或多或少是more文档的SQL版本。
这将“它是否在黑名单上”的检查和matches插入包含在一小段简单的SQL中。NEW variable in a trigger是对您正在处理的新行的引用。如果NEW.part_no与blacklist中的任何内容都不匹配,那么SELECT将不会产生任何内容,也不会执行INSERT。
假设您在blacklist.part_no上有一个索引(无论如何看起来像一个PK ),所以上面的操作应该足够快了。
如果您需要参考,PostgreSQL文档非常好,并且有一整节关于stored procedures and triggers的内容。
https://stackoverflow.com/questions/6839428
复制相似问题