[pgsql-jp: 28800] シーケンスの利用について
Mashiki
mashiki @ yanah.com
2003年 1月 28日 (火) 12:06:44 JST
mashikiです。
シーケンスを使用するSQLを以下のように発行すると、
少し直感に逆らう動きします。
-------------------
/* 定義 */
create sequence sq1;
create table tb1 (c1 int4, c2 int4);
/* 登録 */
/* case 1 */
insert into tb1 (c1, c2) values (nextval('sq1'), currval('sq1'));
/* case 2 */
insert into tb1 (c2, c1) values (nextval('sq1'), currval('sq1'));
/* 確認 */
select * from tb1;
/* 片付け */
drop sequence sq1;
drop table tb1;
----------------------
期待する結果、
c1 | c2
----+----
1 | 1
2 | 2
(2 rows)
実際の結果
c1 | c2
----+----
1 | 1
1 | 2
(2 rows)
動きからして、インサート文のカラムの並びでなく、テーブルの定義の順に
カラムのvaluesが評価されているように見えます。
ちなみに、case1とcase2の順序を逆にして流すと、エラーになります。
アプリケーション内で書く場合、注意が必要ですね。
何故、このような仕様になっているのでしょうか?
参考まで、
ORACLEでは同じシーケンスのnextvalは同じ行で同じ値を返すことが
保証されているので
insert into tb1 (c1, c2) values (sq1.nextval, sq1.nextval);
のように書くことが出来ますが、PostgreSQLでは2回インクリメント
されてしまいます。
pgsql-jp メーリングリストの案内