首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Postgres DB中的触发器

Postgres DB中的触发器
EN

Stack Overflow用户
提问于 2011-07-27 12:27:33
回答 1查看 296关注 0票数 1

在Postgres中创建此触发器的最有效方法是什么。

我将在下面提供一个非常简单的示例,说明我需要什么,但它基于相同的概念。

考虑一下,我们得到的模式定义如下:

代码语言:javascript
复制
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表上创建一个新条目。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2011-07-27 12:59:40

您可能需要在items上插入之前或插入之后的trigger

代码语言:javascript
复制
create trigger blacklist_matches after insert on items
for each row execute procedure check_blacklist();

然后,check_blacklist函数将如下所示:

代码语言:javascript
复制
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_noblacklist中的任何内容都不匹配,那么SELECT将不会产生任何内容,也不会执行INSERT。

假设您在blacklist.part_no上有一个索引(无论如何看起来像一个PK ),所以上面的操作应该足够快了。

如果您需要参考,PostgreSQL文档非常好,并且有一整节关于stored procedures and triggers的内容。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6839428

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档