我正在使用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');
而不是在上面的update语句中再次为触发器重写逻辑。有没有办法通过执行虚拟更新或“触摸”样式操作来触发上面的触发器,该操作会在数据库中的所有行上翻转触发器。
我试图寻找这种虚拟或“触摸”类型操作的语法或示例,但找不到任何解释如何执行此操作的内容。
答案 0 :(得分:15)
由于表很小,只需对整个表进行虚拟更新:
更新pg_rocks_post set title = title;
让触发器发挥作用。
答案 1 :(得分:0)
通常,触发器将在BEFORE上或在插入,更新或删除行之后的表上运行。有几个选项可以让您决定何时调用触发器。
在插入之前更新当前正在插入的行将是使用触发器的典型方法。然后只需在实际表上创建一个触发器:
CREATE TRIGGER trig_title_upweight_trigger
BEFORE INSERT OR UPDATE
ON pg_rocks_post
FOR EACH ROW
EXECUTE PROCEDURE title_upweight_trigger();