Postgresql:シーケンスが加算されないナゾ

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

原因は、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|
+----------------+