PostgreSQL9.5のupsertのON CONFLICT DO NOTHINGの動作確認

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が実行されアップデートが実行されません。(常にインサート)

公式サイトわかりづらいです。

参考サイト

コメント

株式会社CONFRAGE ITソリューション事業部をもっと見る

今すぐ購読し、続きを読んで、すべてのアーカイブにアクセスしましょう。

続きを読む

タイトルとURLをコピーしました