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