SQLiteメモ:オートインクリメントするカラムの値をINSERT直後に取り出すには
SQLiteで自動でインクリメントするカラムを定義するには
「カラム名 INTEGER PRIMARY KEY」
という風にしてCREATE TABLEします。下が例になります。下の例ではカラム名IDXという名前のオートインクリメントされるカラムを定義しています。下のサンプルで作成されたテーブルにINSERTするとIDXは自動でインクリメントされていきます。インサートするたびに1,2,3・・・と勝手にインクリメントされるわけです。ユニークな値ですのでこれをキーとして利用したりします。最後のほうのバグ回避のおまじないは現在のバージョンのSQLiteに不具合があるらしくらしくクローズエラーになるのでハンドルをundefで開放してあげています。やらないとエラーが表示されますが動かないというわけではないようです。
#!/usr/bin/perl
#
# テスト用テーブルTEST_TBLを作成するサンプル
#
#1 IDX INTEGER PRIMARY KEY,
#2 NAME
#3 ADDR
#
use DBI;my $mydb = “TEST.DB”;
my $hDB = DBI->connect(
“dbi:SQLite:dbname=$mydb”,””,””,{PrintError=>0}
);if(!$hDB){
print “$DBI::errstr \n”;
exit(-1);
}my $sql = “CREATE TABLE TEST_TBL(
IDX INTEGER PRIMARY KEY,
NAME,
ADDR
)”;my $hst = $hDB->do($sql);
if(!$hst){
print $hDB->errstr . “\n”;
exit(-1);
}$hDB->disconnect;
そして、データをINSERTした直後にこのIDXの値が欲しい場合があります。INSERTした後にSELECTして取り出すのは面倒です。そういう場合は、「last_insert_rowid」を使います。
これで、INSERTしたデータに割り振られたIDXの値を取得可能です。
下が例になります。
#!/usr/bin/perl
#
# TEST_TBLにインサートするサンプル
#
#1 IDX INTEGER PRIMARY KEY,
#2 NAME
#3 ADDR
#
use DBI;#DBファイル名
my $mydb = “TEST.DB”;#DB接続
my $hDB = DBI->connect(
“dbi:SQLite:dbname=$mydb”,””,””,{PrintError=>0,AutoCommit=>0}
);#エラーチェック
if(!$hDB){
die $DBI::errstr,”\n”;
}#データ挿入のSQL文
my $SQL = “INSERT INTO TEST_TBL VALUES(NULL,?,?)”;#BEGIN
$hDB->do(‘BEGIN’);#バインド
my $hst = $hDB->prepare($SQL);#エラーチェック
unless($hst){
die $hDB->errstr,”\n”;
}#インサート実行
my $retval = $hst->execute(“TANAKA”,”EHIMME”);
$hst->finish();#エラーチェック
unless($retval){
die $hDB->errstr,”\n”;
}#COMMIT
$hDB->do(‘COMMIT’);my $ret = $hDB->func(‘last_insert_rowid’);
#バグ回避おまじない
undef $hst;
#切断
$hDB->disconnect;print “IDX:$ret\n”;
色々と手抜きが有りますが、INSERT時にエラーが発生した場合、本来はrollbackとかするべきです。
上のサンプルを使って、テーブルを作成し、インサートのほうのサンプルを何回も実行するとIDXの値がインクリメントされて行くのがわかります。
タグ : SQLite