あるPostGISレイヤーから別のレイヤーにフィーチャをコピーするときに、GIDの重複を回避するにはどうすればよいですか?


11

別のPostgresレイヤーに新しい要素(機能)を入力する場合、次の2つの方法で行うことができます。

  1. まれに新しい要素を描画する(「機能の追加」を使用)または
  2. 別のPostgreレイヤー(ソースレイヤー)からいくつかの要素をコピー(またはカット)し、頻繁に行うターゲットレイヤーに貼り付けます

最初の例では、このレイヤーがpostgreデータベースシーケンスからgidを取得するため、編集の保存は正常に機能します* nextval( 'layer_name_gid_seq' :: regclass)*

2番目の例では、ソースレイヤーからターゲットレイヤーに要素をコピーしているときにqgis がソースレイヤーから要素のgidをコピーしたため、編集の保存中にエラーが発生しました 。編集を保存しようとすると、次のエラーが返されます。

レイヤー「Cjevovodi」への変更をコミットできませんでした
エラー:エラー:1つの機能が追加されていません。
プロバイダーエラー:
機能の追加中のPostGISエラー:エラー:重複するキー値が一意の制約 "cjevovodi_okill_pkey"に違反しています
詳細:キー(gid)=(5)は既に存在します。

* nextval( 'layer_name_gid_seq' :: regclass)*をフィールドgidにコピーしようとしましたが、フィールドが数値として定義されているため、このシーケンスをフィールドgidに貼り付けることはできません。

(既存のgidで)ソースレイヤーから要素をコピーして新しいgidを割り当てる簡単な方法を知っている人はいますか?

ありがとう!


どのバージョンのqgis​​とプラットフォームを使用していますか?Windows 7でQGIS 2.0を使用していますが、Postigレイヤー間のコピーペーストに問題がないようです。
Alexandre Neto

この問題の解決策を見つけたことがありますか?まったく同じ問題が発生しています。他の機能をコピーして新しい機能を作成するときにQGISがデフォルト値を取得しない場合は、PostgreSQLでトリガーを設定する必要はありません。
Spatial

回答:


4

QGIS 2.2 Windows、c3a2817ではこれを再現できません。

他のバージョンの動作が異なる場合、またはこの問題が引き続き発生する場合は、回避策としてテーブルにPostgreSQLトリガーを設定できます。

この例の表を使用して:

CREATE TABLE testing (gid serial PRIMARY KEY, geom geometry(Polygon, 4326));

以下はgid、必要に応じて新しい関数を割り当てるトリガー関数です。

CREATE OR REPLACE FUNCTION testing_insert_trigger()
RETURNS trigger AS
$$
BEGIN
IF EXISTS (SELECT 1 FROM testing WHERE gid = NEW.gid) THEN
    NEW.gid := nextval('testing_gid_seq'::regclass);
END IF;
RETURN NEW;
END;
$$ language 'plpgsql';

関数をテーブルにバインドしています...

CREATE TRIGGER testing_insert 
BEFORE INSERT ON testing
FOR EACH ROW EXECUTE PROCEDURE testing_insert_trigger();

これにより、gid既存のIDが自動的に割り当てられます。たとえば、次のクエリは、失敗するのではなく、テーブル内のすべてのデータを複製します。

INSERT INTO testing (SELECT * FROM testing);

もちろん、このアプローチは主キーの意図を損なう可能性があるため、慎重に使用してください。


0

ソースレイヤーからフィーチャを選択し、選択したものを(選択した名前を付けて保存...)をシェープファイルに保存します。保存したシェープファイルをQGISプロジェクトに追加して属性テーブルを開き、フィールド「gid」を削除してシェープファイルを保存します。シェープファイルでフィーチャを選択し、作業レイヤーにコピーします。


回答ありがとうございます。もっと簡単な方法を見つけようとしています。
hapa

1
gid serial、int iのようなテーブルがある場合、iを挿入するだけでgidが自動的に取得されます。QGISにある可能性があるという遠い記憶がありますが、それを行う方法を思い出せません
simplexio
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.