PostgreSQLエラー「ERROR: duplicate key violates unique constraint "テーブル名_pkey"」の原因と解決方法

PostgreSQLデータベースで、insert処理を行おうとした時に、主キー(プライマリキー)の値が一意とならない場合には、上記のようなエラーが発生する。

《例》以下のSQLを実行した場合
INSERT INTO nobuneko_table (nobu_id, neko_id) VALUES (1, 105);
INSERT INTO nobuneko_table (nobu_id, neko_id) VALUES (1, 200);

※nobuneko_table:テーブル名、nobu_id:主キー(プライマリーキー)

上記SQLを実行した場合、以下のエラーが発生する。
ERROR: duplicate key violates unique constraint "nobuneko_table_pkey"

主キー(プライマリーキー)が一意となるように(重複しないように)SQL文を見直すことで上記のエラーは回避できる。

主キー(プライマリーキー)をシーケンス値等でシステムにより自動取得している場合は、自動取得した値が既にデータベースに登録されている値と重複していないかどうかを確認して修正を行う必要がある。データベーステーブルで既に登録されているレコードの主キーの最大値よりもシーケンス値が小さい値の場合、レコードを追加していくにつれてシーケンス値が上昇し、やがて主キーと同じ値を取得しようとして、上記のエラーが発生する場合もあるだろう。
シーケンス値の値を現在の主キーの最大値に設定する場合は、以下のようなSQLを実行すると良い。

select setval('シーケンス名',(select max(主キー) from テーブル名));

select setval('nobuneko_table_nobu_id_seq',(select max(nobu_id) from nobuneko_table));

関連記事

前へ

3連休は全て仕事にした

次へ

PHPエラー「rmdir(ディレクトリ名): ディレクトリは空ではありません」の原因と解決方法