[メモ]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” );