sqlite插入自增長標識欄位,獲得新id
sqlite的語法和sql server的語法是有一些區別的,比如插入資料,對於標示種子的欄位,必須指定為NULL,而獲得新id,在sql server中是
SELECT @@IDENTITY[id]
但是在sqlite中不是這樣,而是
insert into t_1(id,name)values(NULL,'趙玉開5');select last_insert_rowid() newid;
注意獲得新id的函式是last_insert_rowid()而不是last_insert_id(),last_insert_id()函式是mysql中獲得新插入自增數字主鍵的函式。另外sqlite比較怪異的一點是,對於自增數字主鍵,必須指定為NULL值。
rowid和 Integer主鍵及自增屬性
大多數情況下,sqlite3的表都有一個rowid(也叫oid,_rowid_),這是一個64位的整數,並作為sqlite儲存結構B樹的主鍵.因此使用rowid查詢會比以其他設定的主鍵查詢,速度會非常快.
在做插入操作的時候,對於rowid的值通常情況下不要去指定,讓系統自己去決定該去何值。因為sqlite會通過SQLITE_SEQUENCE來追蹤表的rowid取值情況.而且sqlite定義了rowid的取值演算法:在未超出rowid的範圍內,待插入記錄的rowid總是表中存在過的的rowid最大值+1。比如依次插入5條記錄,此時最後一條記錄的rowid是5,如果把這條記錄刪除再插入新記錄,此時新紀錄的rowid是6.而當rowid達到所能表達的最大值時,這時如果有新紀錄要插入,系統就會隨機從之前的沒有使用過的正整數中隨機取一個作為rowid(就是之前刪除過的).若沒有未使用的正整數並且你沒有在插入的時候制定rowid為某一個負數的話,系統就會丟擲SQLITE_FULL的錯誤.
如果在建立表的時候設定了主鍵,並且設定主鍵的那列是integer(不是int,short integer等等),並且主鍵沒有設定降序時,這時的主鍵是rowid的別名,換言之,主鍵和rowid沒有區別.如果我們再設定主鍵autoincrement屬性時,和rowid又有什麼區別呢?區別只是在於此時主鍵的取值是一個未使用過的rowid值,而這個rowid值系統會保證其是單調增長的,通常情況下就是表中存在過的rowid最大值+1.這裡所說的通常情況下是因為有這樣一種情況:當插入操作由於表約束而失敗的時候,本來要賦值的rowid,有可能不會在下次插入操作中使用,此時主鍵的取值就是表中存在過的rowid最大值+2.
因此對於使用者id是整數的表,是單獨設主鍵去維護還是直接使用rowid作為主鍵,就取決於各自的業務邏輯關係了.在這種情況下,通常不使用rowid的主鍵特性.
取出某一段資料
sqlite取出某一段資料是用limit,比如要取出第6-20條記錄,只需:
select * from TableName limit 5,15.