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

har*_*jay 8 postgresql triggers tsvector sql-update

我正在使用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                |
Run Code Online (Sandbox Code Playgroud)

我创建了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;
Run Code Online (Sandbox Code Playgroud)

我知道触发器有效,因为当我更新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');
Run Code Online (Sandbox Code Playgroud)

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

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

jja*_*nes 18

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

更新pg_rocks_post set title = title;

让触发器做它的事情.

  • 如果您已经精确地仅在值实际更改时才使用触发器,则此解决方案将不起作用:`... BEFORE UPDATE OF title ... WHEN (OLD.title IS DISTINCT FROM NEW.title) ...` (3认同)