2016-08-31 5 views
1

私はPostgres 9.4を実行しています。tsvector_update_triggerが元々作成したtsvectorカラムを再作成する方法

私は、このトリガーによって移入されたmain_search_index_colという列があります。pg_catalog.english

を置き換えるために、私は先に行ってとunaccent_english(public.unaccent_english)と呼ばれる新しいテキスト検索設定を作成しました

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') 

私は上記のトリガーを落とし、代わりにthe_entries上

pg_catalog.englishドロップトリガmain_vector_updateのpublic.unaccent_englishを使用してそれをやり直しました。

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

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; 

ありませんトリガ関数定義の内部知識が必要であり、テーブル全体も書き換えられます。あなたはあなたの答えは完璧です

VACUUM (FULL, ANALYZE) the_entries; 
+0

でテーブルの上の空き領域を解放したい場合があり、このようなUPDATE

。ありがとうございました! – user1175849

関連する問題