[MySQLメモ]オートインクリメントするカラムの値をINSERT直後に取り出すには
dfGalleryの画像アップロードがいまいち安定性がないので(特に複数画像の一括アップロード時、さくらだから?)ちょっと自前で簡易のアップローダを作ってみたのですが、その際にMySQLをいじったのでちょっと勉強した点だけメモっておきます。
◆関連:SQLiteメモ:オートインクリメントするカラムの値をINSERT直後に取り出すには
◇参考:Bluestick.JP 開発メモ – SQLServer, MySQL, SQLiteで自動採番列の結果を取得するには
◇参考:perl DBI 最後に挿入したIDを取得する方法 last_insert_id
具体的には下の様なコードを書いたのでそのまま貼り付けておきます。
肝心の部分は下の部分で、last_insert_idを使うとオートインクリメントされたidの値を取得する事ができます。
my $LID = $hDB->last_insert_id($cfg{database}, $cfg{database}, "$cfg{dbprefix}content", ‘id’);
SQLiteの場合と違って引数にデータベース名とテーブル名、カラム名?等の引数が必要なのがちょっと面倒ですね。面倒というほどでもないか。
#———————————————————-
# DB登録
#1.kumacchi_content テーブルにタイトルをインサート
#2.1.のインサート時のオートインクリメントされたidを取得
#
# id uid pid type title
# 39 1 33 image onaji2
#
# 3. 2.で取得したidをcidにして 画像3種の登録 kumacchi_contentprop テーブルに
#
# id cid name value
# 110 39 thumbnail_file FXP0000012.jpg
# 111 39 image_file FXP0000012.jpg
# 112 39 timestamp 1256931224
#———————————————————-
sub insertDB{
my ($ori,$tumb,$title) = @_;
my $cnt =0;
my $hDB = DBI->connect("DBI:$cfg{dbdriver}:$cfg{database}:$cfg{hostname};mysql_server_prepare=1","$cfg{username}","$cfg{password}",{PrintError=>0});
unless($hDB){&error($DBI::errstr);}
$hDB->do("set names utf8");
my $SQL = "INSERT INTO $cfg{dbprefix}content VALUES(NULL,?,?,?,?)";
$hDB->do(‘BEGIN’);
my $hst = $hDB->prepare($SQL);
unless($hst){&error($hDB->errstr);}
my $retval = $hst->execute("1",$kdecode::in{‘album’},"image",$title);
unless($retval){&error($hDB->errstr);}
#my $LID = $hDB->func(‘LAST_INSERT_ID’);
my $LID = $hDB->last_insert_id($cfg{database}, $cfg{database}, "$cfg{dbprefix}content", ‘id’);
#&error("$LID");
$SQL = "INSERT INTO $cfg{dbprefix}contentprop VALUES(NULL,?,?,?)";
$hst = $hDB->prepare($SQL);
unless($hst){&error($hDB->errstr);}
$retval = $hst->execute($LID,"thumbnail_file",$tumb);
unless($retval){&error("1:".$hDB->errstr);}
$SQL = "INSERT INTO $cfg{dbprefix}contentprop VALUES(NULL,?,?,?)";
$hst = $hDB->prepare($SQL);
unless($hst){&error($hDB->errstr);}
$retval = $hst->execute($LID,"image_file",$ori);
unless($retval){&error("2:".$hDB->errstr);}
$SQL = "INSERT INTO $cfg{dbprefix}contentprop VALUES(NULL,?,?,?)";
$hst = $hDB->prepare($SQL);
unless($hst){&error($hDB->errstr);}
$retval = $hst->execute($LID,"timestamp",time);
unless($retval){&error("3:".$hDB->errstr);}
#コミット
$hDB->do(‘COMMIT’);
$hst = undef;
#DB切断
$hDB->disconnect;
}