PostgreSQL9.5のupsertのON CONFLICT DO NOTHINGの動作確認
PostgreSQL9.5から追加されたupsertでon conflict do nothingをつけて、既にデータがあればインサートにいかないような動きを期待していたのですが、どんどん同じデータがインサートされていったので動作を調べてみました。
ISNERT INTO テーブル名 VALUES (1,1,1) ON CONFLICT DO NOTHING;
こんな感じでインサート文を書くと既にデータがある場合はインサートされずにエラーも出ずに何もなかった感じの動作になりました。但しこれは制約(主キー)があるテーブルの場合で、制約がないテーブルの場合はどんどん同一データがインサートされていくという動きのようです。
ON CONFLICT ON CONSTRAINT 制約名
ON CONFLICT ON CONSTRAINT 制約名
でマージ文を発行することが出来ます。
ON CONFLICT ON CONSTRAINT 制約名
で制約名が指定できますが、インデックス名は指定できません。
ID(主キー)がサロゲートキーのケース
INSERT INTO テーブル名 (~) VALUES (~) ON CONFLICT ID SET ~
としてIDが既に存在する場合、アップデートすることが出来ますが、IDがサロゲートキーでシーケンスオブジェクトを使用している場合、VALUES句にIDを省略することが出来ますが、IDを省略した場合、NEXTVALが実行されアップデートが実行されません。(常にインサート)
公式サイトわかりづらいです。
KHI入社して退社。今はCONFRAGEで正社員です。関西で140-170/80~120万から受け付けております^^
得意技はJS(ES6),Java,AWSの大体のリソースです
コメントはやさしくお願いいたします^^
座右の銘は、「狭き門より入れ」「願わくは、我に七難八苦を与えたまえ」です^^
コメント