#navi(../)
* PostgreSQLでINSERTした時のserial値を取得する方法 [#kadb7e2e]
INSERTした時にインクリメントされる、serial not null primary keyで指定したカラム値は、SELECT LASTVAL();で取得できます。~
以下、実際にテーブルを作成し、INSERTした時の実行例を記します。

#contents
#htmlinsertpcsp(db-top.html,db-sp.html)

* テスト環境など [#r1f52cc7]
PostgreSQLのバージョンと作成したテーブルを以下に記します。

** PostgreSQLバージョン [#s1d315e5]
 sakuradb=> select version();
                                                 version
 -------------------------------------------------------------------------------------------------------
  PostgreSQL 9.4.9 on armv7l-unknown-linux-gnueabihf, compiled by gcc (Raspbian 4.9.2-10) 4.9.2, 32-bit
 (1 row)


** 作成したテストテーブル [#la934df2]
 CREATE TABLE tbl (id serial not null primary key, txt text);

** テスト環境 [#lbeea4b0]
2つのクライアントから作成したtblテーブルを操作します。
#ref(01.png)


* 2つのクライアントから操作してみる [#n3aeafb8]
1つのPostgreSQLサーバに2つのクライアント(psqlフロントエンドを使用)を接続し、INSERTを発行してみます。~

上記のテスト環境にする記した通り、AとBの2つのクライアントがPostgreSQLに接続しています。~
以下に時系列で記します。
||''A''|''B''|
|1|PostgreSQLに接続|PostgreSQLに接続|
|2|sakuradb=> INSERT INTO tbl(txt) VALUES('A-01')&br;INSERT 0 1&br;sakuradb=> SELECT LASTVAL();&br;lastval&br;---------&br;       1&br;&br;(1 row)||
|3||sakuradb=> INSERT INTO tbl(txt) VALUES('B-01');&br;INSERT 0 1&br;sakuradb=> SELECT LASTVAL();&br; lastval&br;---------&br;       2&br;(1 row)&br;|
|4|sakuradb=> SELECT LASTVAL();&br; lastval&br;---------&br;       1&br;(1 row)&br;||
|5|sakuradb=> INSERT INTO tbl(txt) VALUES('A-02');&br;INSERT 0 1&br;sakuradb=> SELECT LASTVAL();&br; lastval&br;---------&br;       3&br;(1 row)&br;||

上記を見るとわかるように、各クライアント側でINSERTした最後の値が LASTVAL() 関数で返却されているのが確認できます。

* BEGIN COMMIT ROLLBACK を使用してみた場合の動作 [#w43ce93b]
以下にBEGIN COMMIT ROLLBACKを使用した実行例を記します。~
テーブルはDROP,CREATEしなおしました。

||''A''|''B''|
|1|sakuradb=> BEGIN;&br;BEGIN&br;||
|3|sakuradb=> INSERT INTO tbl(txt) VALUES('A-01');&br;INSERT 0 1&br;sakuradb=> SELECT LASTVAL();&br; lastval&br;---------&br;       1&br;(1 row)&br;||
|4||sakuradb=> INSERT INTO tbl(txt) VALUES('B-01');&br;INSERT 0 1&br;sakuradb=> SELECT LASTVAL();&br; lastval&br;---------&br;       2&br;(1 row)&br;|
|5|sakuradb=> ROLLBACK;&br;ROLLBACK;&br;||
|6|sakuradb=> SELECT LASTVAL();&br; lastval&br;---------&br;       1&br;(1 row)&br;||
|7|sakuradb=> INSERT INTO tbl(txt) VALUES('A-02');&br;INSERT 0 1&br;sakuradb=> SELECT LASTVAL();&br; lastval&br;---------&br;       3&br;(1 row)&br;||

上記の結果を見ると ROLLBACKしたINSERTは破棄され、LASTVALも登録されずインクリメントされているのが確認できます。

上記手順後にSELECT * した時の出力です。~
id=1が登録されていないのが確認できます。
 sakuradb=> SELECT * FROM tbl;
  id | txt
 ----+------
   2 | B-01
   3 | A-02

以上、serial用に採番された値を取得するLASTVAL()の動作についてでした。

#htmlinsertpcsp(db-btm.html,db-sp.html)

トップ   編集 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS