如何重新创建最初由tsvector_update_trigger填充的tsvector列

时间:2016-08-31 07:18:30

标签: postgresql triggers tsvector

我正在运行Postgres 9.4。

我有一个名为main_search_index_col的列,该列由此触发器填充:

main_vector_update BEFORE INSERT OR UPDATE ON the_entries 
   FOR EACH ROW EXECUTE PROCEDURE 
   svector_update_trigger('main_search_index_col','pg_catalog.english', 'name', 'location', 'type')

我已经开始创建一个名为unaccent_english(public.unaccent_english)的新文本搜索配置来替换pg_catalog.english

我删除了上面的触发器并使用public.unaccent_english而不是pg_catalog.english重做它

在the_entries上删除触发器main_vector_update;

CREATE TRIGGER main_vector_update BEFORE INSERT OR UPDATE ON the_entries
FOR EACH ROW EXECUTE PROCEDURE
tsvector_update_trigger('main_search_index_col','public.unaccent_english', 'name', 'location', 'type');

但据我了解,除非更新行或​​添加新行,否则不会更改main_search_index_col中的任何值。

我想要通过并更新每行的main_search_index_col,或者删除列并完全重新创建它并填充它,好像它的新表单中的触发器一直存在一样。

如何使新的触发器列main_search_index_col的内容正确?

另外,我如何看到tsvector_update_trigger的确切定义?我有一种感觉,如果我能阅读它的定义,它可能有助于我自己的解决方案。

1 个答案:

答案 0 :(得分:2)

您可以在tsvector_update_trigger中找到src/backend/utils/adt/tsvector_op.c的定义。

您可以更新表格以匹配新的触发器定义,如下所示:

UPDATE the_entries
   SET main_search_index_col =
       to_tsvector(
          'public.unaccent_english', name || ' ' || location || ' ' || type
       );

但你也可以使用触发器并按照这样做:

UPDATE the_entries SET name = name;

这不需要内部知识的触发器函数定义,它也会重写整个表。

在这样的UPDATE之后,您可能希望使用

释放表格上的可用空间
VACUUM (FULL, ANALYZE) the_entries;