[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;
}

タグ : , , ,