2021年12月5日日曜日

[メモ] PostgreSQL serial型チート

 興味がないからすぐに忘れて毎回検索してるの面倒くさいのでここにメモ代わりに置いておく。


[作成]

テーブル名 xxx, カラム名 yyy としてテーブルを生成するとシリアル列"xxx.yyy"用に暗黙的なシーケンス"xxx_yyy_seq"が自動生成される

  CREATE TABLE xxx (

    yyy serial not null,

    dummy text

  );


> foobar=# \d

>                        リレーションの一覧

>  スキーマ |            名前            |     型     |   所有者

> ----------+----------------------------+------------+------------

>  public   | xxx                        | テーブル   | foobar

>  public   | xxx_yyy_seq                | シーケンス | foobar

 

[削除]

テーブルxxxを破棄(DROP TBALE)すれば、自動生成された xxx_yyy_sql も破棄される。


[シーケンス確認]

シーケンスをSELECTすると、現在の値が取得できる。

last_valueが現在値。


>  foobar=# SELECT * FROM xxx_yyy_seq;

>  sequence_name | last_value | start_value | increment_by |      max_value      | min_value | cache_value | log_cnt | is_cycled | is_called

> ---------------+------------+-------------+--------------+---------------------+-----------+-------------+---------+-----------+-----------

>  xxx_yyy_seq   |          1 |           1 |            1 | 9223372036854775807 |         1 |           1 |       0 | f         | f


[シーケンスの値の設定]

SETVAL関数でシーケンスの値を任意に変更できる。

> SELECT setval('xxx_yyy_seq', 1, false);


第3引数でlast_valueに対してどのようにカウントアップするか設定できる。

> SELECT setval('xxx_yyy_seq', 1000, true);   --1001からカウントアップ

> SELECT setval('xxx_yyy_seq', 1000, false);  --1000からカウントアップ


[直近のシーケンスの値の取得]

同一セッション内なら自動処理したシーケンスの値を取得できる。

> foobar=# SELECT setval('xxx_yyy_seq', 1000, false);

> foobar=# INSERT INTO xxx (dummy) VALUES ('ddami-');

> foobar=# INSERT INTO xxx (dummy) VALUES ('ddami-');

> foobar=# SELECT currval('xxx_yyy_seq');

>  currval

> ---------

>     1001