OracleとPostgreSQLのシーケンスキャッシュを使用した場合の動作差異についてメモ。PostgreSQLの
cache
はデフォルト1なので、変更しない限りは同じような採番になると思われるが、実際はそうはならない。ここではPostgreSQLのCache値を変更した場合の注意点を記載。
シーケンスの作成
OracleとPostgreSQL両方ともシーケンスの始まりを「1」、キャッシュを「20」と設定。
Oracle
drop sequence oraseq1;
create sequence oraseq1 start with 1 increment by 1 cache 20;
PostgreSQL
drop sequence pgsqlseq1;
create sequence pgsqlseq1 start with 1 increment by 1 cache 20;
Oracle環境での動作
Session A
select oraseq1.nextval from dual;
結果は当然シーケンス値は「1」となる。
SQL> select oraseq1.nextval from dual;
NEXTVAL
----------
Session B
select oraseq1.nextval from dual;
別セッションでシーケンスを取得する場合、Oracleではnextvalもcurrvalが「2」となる。※ここの動作がOracleとPostgreSQLが異なる
SQL> select oraseq1.nextval from dual;
NEXTVAL
----------
Session A
select oraseq1.nextval from dual;
SQL> select oraseq1.nextval from dual;
NEXTVAL
----------
PostgreSQL環境での動作
Session A
select nextval('pgsqlseq1');
postgres> select nextval('pgsqlseq1');
+-----------+
| nextval |
|-----------|
| 1 |
+-----------+
Session B
select nextval('pgsqlseq1');
postgres> select nextval('pgsqlseq1');
+-----------+
| nextval |
|-----------|
| 21 |
+-----------+
Session A
select nextval('pgsqlseq1');