[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 メーリングリストの案内