質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
PostgreSQL

PostgreSQLはオープンソースのオブジェクトリレーショナルデータベース管理システムです。 Oracle Databaseで使われるPL/SQLを参考に実装されたビルトイン言語で、Windows、 Mac、Linux、UNIX、MSなどいくつものプラットフォームに対応しています。

PDO

PDO(PHP Data Objects)はPHPのデータベース抽象化レイヤーです。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Q&A

解決済

2回答

2802閲覧

PostgreSQL9.6 PHP7.1 PDO::lastInsertId()で、nextvalしていない場合エラー

himakuma

総合スコア952

PostgreSQL

PostgreSQLはオープンソースのオブジェクトリレーショナルデータベース管理システムです。 Oracle Databaseで使われるPL/SQLを参考に実装されたビルトイン言語で、Windows、 Mac、Linux、UNIX、MSなどいくつものプラットフォームに対応しています。

PDO

PDO(PHP Data Objects)はPHPのデータベース抽象化レイヤーです。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

0グッド

0クリップ

投稿2017/02/24 04:02

PostgreSQL9.6.1
PHP7.1

現在の状況では、Insert後に必ずlastInsertIdを実行しています。
lastInsertIdは内部的に、

SQL

1SELECT LASTVAL ()

を発行していますが、
PostgreSQLの仕様上「nextval」を呼んでいないとエラーになります。
その為、実行したタイミングでトランザクションがエラーになります。

これを回避する為に、現在のトランザクションにて「nextval」が実行されたかを判別するすべはありますか??

トランザクション内で発行するSQLをチェックする、または、lastInsertIdを使わない??

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

もしテーブルが決まっているなら指定して取るのはどうでしょうか?

sql

1 2tsdb=> \d abc 3 Table "public.abc" 4 Column | Type | Modifiers 5--------+---------+------------------------------------------------- 6 a | integer | not null default nextval('abc_a_seq'::regclass) 7 b | integer | 8 9SELECT last_value FROM abc_a_seq; 10

テーブルが決まらない場合を考えでみました。
(1)RETURNINGを使う
INSERTのSQLでreturningを使う事で最新番号を取得する。
(2)FUNCTIONを使う
FUNCTIONのEXCEPTIONでエラーを拾う。

sql

1CREATE OR REPLACE FUNCTION get_last_seq() RETURNS int AS 2$BODY$ 3DECLARE _RC INT := 0; 4BEGIN 5 SELECT LASTVAL() INTO _RC; 6 RETURN _RC; 7EXCEPTION 8 WHEN object_not_in_prerequisite_state 9 THEN RETURN 0; 10END; 11$BODY$ 12LANGUAGE plpgsql; 13 14 15tsdb=> select get_last_seq(); 16 get_last_seq 17-------------- 18 0 19(1 row) 20-- 0はnextval未実行

投稿2017/02/24 09:32

編集2017/02/25 06:46
A.Ichi

総合スコア4070

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

himakuma

2017/02/24 10:02

すいません、テーブルは不定です
himakuma

2017/02/27 04:08

フレームワークにて、lastInsertIdが呼ばれている状態で、 拡張して、lastInsertIdを呼ぶ条件を分岐したかったのですが、無理そうですね。orz returningはカラムを指定する必要があるので対応方法としては除外していました。 全体的にreturningが使えるようにフレームワークを拡張しようと思います。
guest

0

うろ覚えでの回答で申し訳ないのですが、Postgresのlastvalは他のセッションでのnextvalの影響を受けなかったように思います。
このサイトと同じ状態でしょうかね?ご参考までに。

投稿2017/02/24 04:13

kurori

総合スコア111

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

himakuma

2017/02/24 04:16

すいません、すごく特殊な状況だとは思うのですが、同一セッション、同一トランザクション内です。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問