##現象
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。