3

私はpostgresqlが初めてで、複数列の一意の制約について質問があります。

テーブルに行を追加しようとすると、次のエラーが発生しました。

ERROR:  duplicate key value violates unique constraint "i_rb_on"
DETAIL:  Key (a_fk, b_fk)=(296, 16) already exists.

私はこのコードを使用しました(短いバージョン):

INSERT INTO rb_on (a_fk, b_fk) SELECT a.pk, b.pk FROM A, B WHERE NOT EXISTS (SELECT * FROM rb_on WHERE a_fk=a.pk AND b_fk=b.pk);

i_rb_on一意の制約/列(a_fk, b_fk)です。

myWHERE NOT EXISTSは、この種の一意のキーの重複キー エラーに対する保護を提供していないようです。

アップデート:

INSERT INTO tabA (mark_done, log_time, tabB_fk, tabC_fk) 
SELECT FALSE, '2003-09-02 04:05:06', tabB.pk, tabC.pk FROM tabB, tabC, tabD, tabE, tabF 
WHERE (tabC.sf_id='SUMMER' AND tabC.sf_status IN(0,1) 
       AND tabE.inventory_status=0) 
 AND tabF.tabD_fk=tabD.pk 
 AND tabD.tabE_fk=tabE.pk 
 AND tabE.tabB_fk=tabB.pk 
 AND tabF.tabC_fk=tabC.pk 
 AND NOT EXISTS (SELECT * 
                 FROM tabA 
                 WHERE tabB_fk=tabB.pk AND tabC_fk=tabC.pk);

tabA の一意のインデックス:

CREATE UNIQUE INDEX i_tabA
  ON tabA
  USING btree
  (tabB_fk , tabC_fk );

tabA に挿入する必要があるのは、(多数の) 1 行だけです。

4

2 に答える 2

0

最後に LIMIT 1 を追加しました: ...WHERE tabB_fk=tabB.pk AND tabC_fk=tabC.pk) LIMIT1 ; そしてそれはトリックをしました。

LIMIT 1 と ...EXCEPTION WHEN unique_violation THEN ... を使用して関数を作成しましたが、それも機能しました。

ただし、LIMIT 1 と "NOT EXISTS" を使用する場合は、unique_violation エラー処理を使用する必要はないと思います。

于 2013-09-05T00:11:00.490 に答える