2

我正在运行 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 的确切定义?我有一种感觉,如果我能阅读它的定义,它可能有助于制定我自己的解决方案。

4

1 回答 1

4

您可以找到tsvector_update_triggerin的定义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;

注意:对于最近的 PostgreSQL 版本,生成的列比触发器填充的列更简单更好。

于 2016-08-31T07:47:07.857 回答