Perl にてMySQLを利用しています。


以下のプログラムですが、、、

# データベースにつなぐ
$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を切断してから調べなければならないのでしょうか?

回答の条件
  • URL必須
  • 1人20回まで
  • 登録:
  • 終了:2007/11/02 00:05:03
※ 有料アンケート・ポイント付き質問機能は2023年2月28日に終了しました。

回答3件)

id:y-kawaz No.1

回答回数1422ベストアンサー獲得回数226

ポイント27pt

多分、$sth->execute(); の後に以下のようにすることでidの値が取得できると思います。

$id = $sth->{mysql_insertid};

mysql_insertid は最新の AUTO_INCREMENT 値を返す DBI の MySQL 実装L固有の属性です。

http://dev.mysql.com/doc/refman/4.1/ja/perl-dbi-class.html

id:zachouR

ありがとうございます。これで、かなり楽になりました。

というのも、書き込んだ後にIDを調べても良かったのですが、もしその微妙なタイミングで別の人が書き込んでしまったとき、ちょっとまずい事になりそうだったので、即座にIDを取得したかったのです。

2007/10/26 09:31:50
id:y-kawaz No.2

回答回数1422ベストアンサー獲得回数226

ポイント27pt

多分、$sth->execute(); の後に以下のようにすることでidの値が取得できると思います。

$id = $sth->{mysql_insertid};

mysql_insertid は最新の AUTO_INCREMENT 値を返す DBI の MySQL 実装L固有の属性です。

http://dev.mysql.com/doc/refman/4.1/ja/perl-dbi-class.html

id:zachouR

ありがとうございます。これで、かなり楽になりました。

というのも、書き込んだ後にIDを調べても良かったのですが、もしその微妙なタイミングで別の人が書き込んでしまったとき、ちょっとまずい事になりそうだったので、即座にIDを取得したかったのです。

2007/10/26 09:31:53
id:chuken_kenkou No.3

回答回数722ベストアンサー獲得回数54

ポイント26pt

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 の使用

id:zachouR

ありがとうございます。返事が遅くなりまして、すいません。

ということは、途中で他社による+1~の増減はない、と考えてプログラムを組みたいと思います。

「自分が入力した最新のID」を取得したいだけなので、LAST_INSERT_ID() をさっそく使ってみます。

助かりました。

2007/10/29 13:47:13
  • id:y-kawaz
    操作ミスで2重回答してしまいました。すみません…(^_^;
  • id:zachouR
    気にしないでください(^^)

    ありがとうございました。ポイントも返却しなくても大丈夫です。
  • id:b-wind
    Perl 環境ではすでに出ている回答で問題ないですが、一般的には LAST_INSERT_ID() という SQL関数が用意されています。
    http://dev.mysql.com/doc/refman/4.1/ja/example-auto-increment.html
    ご参考までに。
  • id:zachouR
    ありがとうございます。参考にさせて頂きます。

    LAST_INSERT_ID()について1つだけ疑問点があります。

    というのも、この関数を使う間に別のユーザーが書込を行ってしまい、本来欲しいIDナンバーがとれずに、IDの数値が一つ飛ばされてしまう、ということはありえるのでしょうか?

    それとも、切断を行うまではSQLはロックされているのでしょうか?(排他処理のように。)

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

回答リクエストを送信したユーザーはいません