このエントリーをはてなブックマークに追加


PostgreSQLでINSERTした時のserial値を取得する方法

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

テスト環境など

PostgreSQLのバージョンと作成したテーブルを以下に記します。

PostgreSQLバージョン

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)

作成したテストテーブル

CREATE TABLE tbl (id serial not null primary key, txt text);

テスト環境

2つのクライアントから作成したtblテーブルを操作します。

01.png

2つのクライアントから操作してみる

1つのPostgreSQLサーバに2つのクライアント(psqlフロントエンドを使用)を接続し、INSERTを発行してみます。

上記のテスト環境にする記した通り、AとBの2つのクライアントがPostgreSQLに接続しています。
以下に時系列で記します。

AB
1PostgreSQLに接続PostgreSQLに接続
2sakuradb=> INSERT INTO tbl(txt) VALUES('A-01')
INSERT 0 1
sakuradb=> SELECT LASTVAL();
lastval
---------
1

(1 row)
3sakuradb=> INSERT INTO tbl(txt) VALUES('B-01');
INSERT 0 1
sakuradb=> SELECT LASTVAL();
lastval
---------
2
(1 row)
4sakuradb=> SELECT LASTVAL();
lastval
---------
1
(1 row)
5sakuradb=> INSERT INTO tbl(txt) VALUES('A-02');
INSERT 0 1
sakuradb=> SELECT LASTVAL();
lastval
---------
3
(1 row)

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

BEGIN COMMIT ROLLBACK を使用してみた場合の動作

以下にBEGIN COMMIT ROLLBACKを使用した実行例を記します。
テーブルはDROP,CREATEしなおしました。

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

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

上記手順後にSELECT * した時の出力です。
id=1が登録されていないのが確認できます。

sakuradb=> SELECT * FROM tbl;
 id | txt
----+------
  2 | B-01
  3 | A-02

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


添付ファイル: file01.png 940件 [詳細]

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2016-10-20 (木) 21:22:35