以下のプログラムですが、、、
# データベースにつなぐ
$dbh = DBI->connect( $DB, $DBUSER, $DBPASS,{AutoCommit => 0} ) || print $DBI::errstr . "\n";
# SJISの使用を宣言
$sth = $dbh->prepare( "SET NAMES 'sjis'" );
$sth->execute();
$sth = $dbh->prepare( "INSERT INTO `db_01` ( data1, data2 ) VALUES ( $data1, $data2 )" );
$sth->execute();
# 切断
$dbh->disconnect();
というプログラムを組みました。DBにはフィールドが3つあり、(id,data1,data2)になっています。idはauto_incrementで自動的に数値が増えていくようになっています。
上記のプログラムでは書き込んだ瞬間、idはMySQLが勝手に決めてくれるのですが、その書き込んだ時にidの数値はいくつなのか調べる方法はないでしょうか?
一度、DBを切断してから調べなければならないのでしょうか?
多分、$sth->execute(); の後に以下のようにすることでidの値が取得できると思います。
$id = $sth->{mysql_insertid};
mysql_insertid は最新の AUTO_INCREMENT 値を返す DBI の MySQL 実装L固有の属性です。
多分、$sth->execute(); の後に以下のようにすることでidの値が取得できると思います。
$id = $sth->{mysql_insertid};
mysql_insertid は最新の AUTO_INCREMENT 値を返す DBI の MySQL 実装L固有の属性です。
ありがとうございます。これで、かなり楽になりました。
というのも、書き込んだ後にIDを調べても良かったのですが、もしその微妙なタイミングで別の人が書き込んでしまったとき、ちょっとまずい事になりそうだったので、即座にIDを取得したかったのです。
LAST_INSERT_ID()等は、「自分が追加した最新のID」を返します。
他人が追加したものを含め、最新の値を得るには、
「select max(id) from ~」
といったSQLを実行するしかありません。
「最大値を得てから+1するまでの間に、他人に追加される」ことは、LOCK TABLE等を使って表を占有
しなければ、当然、あり得ます。
こういった操作を楽にするのが、auto_incrementの機能なのであり、DB全体の最大値を利用者側が
調べなくても自動的に最大値+1してくれます。
「最新値を知って+1する」というのは、auto_incrementを使っていれば不要な操作であり、そのような
操作をしたいなら、「auto_incrementを使うべきではない」ということになります。
MySQL AB :: MySQL 4.1 リファレンスマニュアル :: 3.6.9 AUTO_INCREMENT の使用
ありがとうございます。返事が遅くなりまして、すいません。
ということは、途中で他社による+1~の増減はない、と考えてプログラムを組みたいと思います。
「自分が入力した最新のID」を取得したいだけなので、LAST_INSERT_ID() をさっそく使ってみます。
助かりました。
ありがとうございます。これで、かなり楽になりました。
というのも、書き込んだ後にIDを調べても良かったのですが、もしその微妙なタイミングで別の人が書き込んでしまったとき、ちょっとまずい事になりそうだったので、即座にIDを取得したかったのです。