先日、データベースのシードファイルを作って初期データを投入。 その後、ブラウザから追加のデータを登録しようとしたところ 「プライマリキーが重複しているよ」といったエラーが出ました。
原因は、PostgresqlにINSERTする際、プライマリキーの値を指定しているためでした。
以下のSQLをご覧ください。1回目と2回目のINSERTはプライマリキーを指定してないので、 シーケンスの値が自動的にインクリメントされます。3回目は明示的にプライマリキーを指定しているので、 シーケンスが置いてけぼりになります:
CREATE TABE test_table (id SERIAL PRIMARY KEY, name VARCHAR(255)); INSERT INTO test_table (name) VALUES ('hoge'); INSERT INTO test_table (name) VALUES ('hoge'); SELECT CURRVAL('test_table_id_seq'); currval --------- 2 (1 行) INSERT INTO test_table (id, name) VALUES (3, 'hoge');INSERT 0 1 SELECT CURRVAL('test_table_id_seq'); currval --------- 2 (1 行)
Mysqlではプライマリキーを明示的に指定しようがしまいが、AUTO INCREMENTが加算されます:
CREATE TABLE test_table (id INTEGER NOT NULL AUTO_INCREMENT PRIMARY KEY, name VARCHAR(255)); INSERT INTO test_table (name) values ('hoge'); INSERT INTO test_table (name) values ('hoge'); SHOW TABLE STATUS FROM `DB名` WHERE `name` LIKE 'test_table'; +----------------+ | Auto_increment | +----------------+ | 2| +----------------+ INSERT INTO test_table (name) values (10, 'hoge'); SHOW TABLE STATUS FROM `DB名` WHERE `name` LIKE 'test_table'; +----------------+ | Auto_increment | +----------------+ | 11| +----------------+