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 を置き換えました。

上記のトリガーを削除し、pg_catalog.english の代わりに public.unaccent_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_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;

注:最近の PostgreSQL バージョンでは、生成された列は、トリガーによって埋められた列よりもシンプルで優れています。

于 2016-08-31T07:47:07.857 に答える