先日、データベースのシードファイルを作って初期データを投入。
その後、ブラウザから追加のデータを登録しようとしたところ
「プライマリキーが重複しているよ」といったエラーが出ました。
原因は、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|
+----------------+