0

st_intersects新しいエントリが名前と一致し、postgis ライブラリを使用して一致する既存の行と交差するかどうかを単純にチェックするテーブルのルールがあります。

一部しか挿入されていないように見えますが、ほとんどはこのルールを通過します。挿入後にいくつかのエントリを手動で確認したところ、ルールがその挿入をブロックするはずだったことが確認できました。

私のルールに何か問題がありますか?

テーブルには 3 つの列があります。id serialname varchar(200)およびway geometry(Linestring,4326)

そして、私のルールは次のとおりです(\d名からの抜粋)

blockduplicate AS
    ON INSERT TO nameslist
   WHERE (EXISTS ( SELECT 1
           FROM nameslist
          WHERE nameslist.name::text = new.name::text AND st_intersects(nameslist.way, new.way) = true)) DO INSTEAD NOTHING

このテーブルは単に名前を持つ行を取り、別のエントリが同じ名前で入ってきて、同じ名前を持つ別の既存のエントリと交差するたびに、ブロックする必要があります。したがって、ジオメトリ フィールド ウェイで表される領域には、この名前のエントリが 1 つしかありません。挿入後、多くの重複が表示されます(フィールドをチェックすると、名前が一致してst_intersects戻ります)。ルールが挿入をブロックしないのはなぜですか?trueway

更新: 1 つのクエリで複数の挿入を行うためですか。実際に、クエリINSERT INTO (a,b,c) VALUES (...),(...),(...),... Does PostgreSQL call the RULE for each value?で 1 ショットで 12000 エントリを挿入します。複数の挿入を行う必要があります。そうしないと、挿入を完了するのに数か月かかります。

4

1 に答える 1

0

わかりました、通常、トリガーはルールよりもクリーンであることがわかります。トリガーは各挿入で起動されます。ルールは、SQL を書き換えるマクロです。ルールを使用する時間と場所がありますが、それらは確かに高度な領域です。

インサートで何が起こるか見てみましょう。次のように仮定します。

  INSERT INTO nameslist
  SELECT * FROM nameslist_import;

ルールは実際にクエリを次のように書き換えます。

  INSERT INTO nameslist
  SELECT * FROM nameslist_import WHERE not (expression modelled on your rule);

通常、ルールを使用してクエリを書き換えるよりも、これをクエリに書き込む方がクリーンです。これにより、各クエリで何をしたいのかを正確に調整できます。このようなデータの重複を防ぎたい場合は、除外制約が適用可能またはトリガーされているかどうかを確認してください。

お役に立てれば。

于 2013-09-17T07:01:38.867 に答える