[メモ]PostgreSQLでINSERTしたシーケンスを取得したい

シーケンスをキーにして動かしている場合、インサートしたレコードのシーケンス番号が欲しい時があります。
参考:PostgreSQLでのシーケンス取得方法(currvalとlast_valueの違い)

PostgreSQLではシーケンスを取得するのにlast_value とcurrvalがあります。

INSERT INTO sample (hoge) values (‘foo’);
SELECT last_value FROM sample_id_seq; // seq=1

取得できるんですが、INSERTとSELECTの間で、別のプログラムがINSERTを行った場合、正しく取得できない。

INSERT INTO sample (hoge) values (‘bar”);
SELECT currval(sample_id_seq);

currvalの場合、同一セッション中で設定された直前のシーケンス値を返すことを保証してくれます
—–
sampleロジック
my $sql_info = “INSERT INTO d_info(“;
$sql_info .= ” id,title,create_date,update_date”;
$sql_info .= ” ) VALUES (?,?,now(),now())”;
my $sth = $self->dbh->prepare( $sql_info );
$ret = $sth->execute( ‘11111’, ‘title’ );

my $sql_seq = “SELECT currval( ‘d_info_id_seq’ )”;
my $sth_seq = $self->dbh->prepare( $sql_seq );
$ret = $sth_seq->execute();
my @w_seq = $sth_seq->fetchrow;
print( “$w_seq[0]\n” );

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です