14

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列にデータを入力する方法を知りたい.

これを行う1つの方法は、更新を実行し、関数を次のようなもので書き直すことだと思います

pgdj=# UPDATE pg_rocks_post SET body_title_titleupweight_tsv =
setweight(to_tsvector( coalesce(title,'')),'A') ||
setweight(to_tsvector(coalesce(body,'')),'D');

上記の更新ステートメントでトリガーのロジックを再度書き直す代わりに。ダミーの更新またはデータベース内のすべての行でトリガーを反転させる「タッチ」スタイルの操作を実行して、上記のトリガーをトリガーする方法はありますか。

そのようなダミーまたは「タッチ」タイプの操作の構文または例を探してみましたが、これを行う方法を説明しているものが見つかりませんでした。

4

2 に答える 2

24

テーブルが小さいため、テーブル全体のダミーの更新を行うだけです。

update pg_rocks_post set title=title;

そして、トリガーに任せてください。

于 2013-10-14T16:22:18.293 に答える