Authentication




Cancel OK
B!コメントする  2012-06-22 11:32:00 by old

SQLiteで最新のAUTOINCREMENT取得してみる

ちょっとしたことならSQLiteはとっても便利。
というかそこそこの事が出来るし負荷もそこそこいける。
なので最近つかってるけどMySQLなんかと少し作法が違う部分があるのでちょっと覚え書き。

SQLiteで最新のAUTOINCREMENTを求める場合は

lastinsertrowid()


を使うと取れるわけなんですが、私のところではうまいこと機能しない・・・。
色々と調べていくとどうやらロックの関係とか追加タイミングとかが重なって異様に時間かかったりした。
SELECT * FROM テーブル名 ORDER BY カラム名 DESC LIMIT 1

とか
select * from テーブル名 where ROWID = lastinsertrowid()

とかでもダメでした。
なので色々とGoogle先生やさらにはBing先生に聞いてみたりしたけどどれも撃沈。
遅延は直っても1つまえの値(ロックの関係で)だったりとどれもイマイチ。

ここまでくると設計に問題があるんだろ?ってのはあるんですけどそれは言わないお約束。(本当は声を大にして言いたいんだけど)
でたどり着いた結論として

sqlitesequence


を使うというもの。
SQLiteではsqlite
sequenceの中にAUTOINCREMENTの値が収められています。
リクエストとシンプルに

SELECT * FROM sqlitesequence


結果をdump表示するとこんな感じ

array(4) {
["name"]=>
string(11) "sample
list"
[0]=>
string(11) "sample_list"
["seq"]=>
string(2) "24"
[1]=>
string(2) "24"
}


中身は「name」と「seq」という値が入っており、nameにはテーブル名、seqには過去にAUTOINCREMENTで割り当てられた最大値が入っております。
設計上は関連を保つための値を取得したかっただけなので、この値を採用。

厳密な設計とかも含めると絶対的に信頼できる値ではないけど、こんな簡単なのでも一応AUTOINCREMENTの最新値はとれますよと言うことで。


SQL  

  • コメント
  • コメントはまだありません