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の値がインクリメントされて行くのがわかります。

(Visited 269 times, 1 visits today)

タグ :