PostgreSQL/INSERTした時のserial値を取得する方法
の編集
Top
/
PostgreSQL
/
INSERTした時のserial値を取得する方法
[
トップ
] [
編集
|
差分
|
バックアップ
|
添付
|
リロード
] [
新規
|
一覧
|
検索
|
最終更新
|
ヘルプ
]
-- 雛形とするページ --
PostgreSQL/template0とtemplate1の違いについて
#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)
タイムスタンプを変更しない
#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)
テキスト整形のルールを表示する
添付ファイル:
01.png
941件
[
詳細
]