将 postgreSQL 触发器应用于数据库中的现有行



我正在使用PostgeSQL 9.2.2。我的数据库架构是

pg_rocks_post
 title                        | character varying(1024) | not null
 body                         | text                    | not null
 body_title_tsv               | tsvector                |
 body_title_titleupweight_tsv | tsvector                |

我将body_title_titleupweight_tsv创建为类型tsvector。然后,我使用文档中的示例定义了一个触发器,该触发器对标题进行了加权,如下所示。

pgdj=# CREATE FUNCTION title_upweight_trigger() RETURNS trigger AS $$
begin
new.body_title_titleupweight_tsv :=
setweight(to_tsvector('pg_catalog.english', coalesce(new.title,'')), 'A') ||
setweight(to_tsvector('pg_catalog.english', coalesce(new.body,'')), 'D');
return new;
end
$$ LANGUAGE plpgsql;

我知道触发器有效,因为当我更新pg_rocks_post中的条目然后查询它时:我看到它已使用该更新的行正确填充了body_title_titleupweight_tsv ts_vector。

我的问题是如何让它将触发器应用于表中的现有行。我只在学习 postgres,因此我的测试数据库中有几百个条目,想知道如何填充body_title_titleupweight_tsv列。

我认为一种方法是运行更新并使用类似的东西编写函数

pgdj=# UPDATE pg_rocks_post SET body_title_titleupweight_tsv =
setweight(to_tsvector( coalesce(title,'')),'A') ||
setweight(to_tsvector(coalesce(body,'')),'D');

而不是在上面的更新语句中再次重写触发器的逻辑。有没有办法通过执行虚拟更新或"触摸"样式操作来触发上述触发器,该操作在数据库中的所有行上翻转触发器。

我尝试寻找此类虚拟或"触摸"类型操作的语法或示例,但找不到任何解释如何执行此操作的示例。

由于表很小,只需对整个表进行虚拟更新:

更新pg_rocks_post设置标题=标题;

让触发器做它的事情。

通常,触发器会在插入、更新或删除行之前或之后在表上运行。有几个选项可用于决定何时调用触发器。

在插入

之前更新当前正在插入的行将是使用触发器的典型方法。 然后只需在实际表上创建一个触发器:

CREATE TRIGGER trig_title_upweight_trigger
  BEFORE INSERT OR UPDATE
  ON pg_rocks_post
  FOR EACH ROW
  EXECUTE PROCEDURE title_upweight_trigger();

最新更新