6
6

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

Herokuでduplicate key value violates unique constraintと怒られたときの対処法

Last updated at Posted at 2015-12-03

##現象
Herokuのデータベースにレコードを追加しようとすると、以下のようなエラーメッセージがでることがある。

PG::UniqueViolation: ERROR:  duplicate key value violates unique constraint "テーブル名_pkey"
2015-12-02T08:55:37.548233+00:00 app[web.1]: DETAIL:  Key (id)=(1) already exists.

「id = 1は既に存在します」と怒られている。たしかにすでに複数レコードが保存されているのだが、最大値のidでよしなに保存してくれないようだ。

##原因

postgresqlのシーケンス値は、mysqlと違って指定カラムの最大値を取ってくれるのではなく、別に保存してある「最大値」を設定するようになっている。

SQLでinsertして行く分には基本問題ないけれど、**CSVなどからインポートした場合、保存した値とずれてしまい、**SQLからのinsert時に"duplicate key value violates unique constraint"などと怒られてしまうことがある。

参考 : http://blog.livedoor.jp/loopus/archives/50846480.html

たしかに自分の場合もrake db:seedでダミーデータを流し込んでいた。
(ローカル環境のsqliteでは問題なくレコード追加できてしまう。)

##対処法

対処法としては、HerokuのPostgreSQLに接続して

select setval('テーブル名_id_seq',(select max(id) from テーブル名));

と実行してやるとOK。

6
6
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
6

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?