いくつかのフィールドにインデックスが付けられた PostgreSQL テーブルがあり、それらは重複を防ぐために一意である必要があります。これは、すべてのフィールドを挿入し、unique_violation 例外をキャッチする PLPGSQL 関数のおかげで行われますが、重複が 1 つしかない場合でもレコードの挿入を停止します。
パフォーマンスの問題により、いくつかの INSERT を作成できません (これらのいくつかは数百回行われます)。問題は、次の例の最初の 2 つの値のように、重複が 1 つだけであってもすべてのプロセスが停止することです。
CREATE OR REPLACE FUNCTION easy_import() RETURNS VOID AS
$$
BEGIN
BEGIN
INSERT INTO things ("title", "uniq1", "uniq2") VALUES
('title 1', 100, 102),
('title 2', 100, 102),
('title 3', 101, 102),
('title 4', 102, 102),
('title 5', 103, 102),
('title 6', 104, 102),
('title 7', 105, 102),
('title 8', 106, 102),
('title 9', 107, 102),
('title 10', 108, 102);
RETURN;
EXCEPTION WHEN unique_violation THEN
-- do nothing
END;
END;
$$
LANGUAGE plpgsql;
1 つのレコードに対してだけ unique_violation を無視し、それ以上の INSERT が停止しないようにする方法はありますか?
ありがとうございました。
アップデート
- 一意のインデックスには、「uniq1」および「uniq2」フィールドがあります。混乱して申し訳ありません。
- @cdhowie の解決策が最善のように見えますが、同じクエリを実行するとエラーが発生するという事実を無視しています。クエリが理由で実行するため、奇妙
JOIN
です。まだ作業中です。