SQLite3中自增主鍵相關知識總結

2022-09-26 12:30:31 字數 2410 閱讀 6090

一、sqlite清空表並將自增列歸零

sql標準中有truncate table語句,用來清空表的所有內容。

但sqlite不支援這個語句。在sqlite中直接使用 delete from tablename 就可以了。

對於大多數dbms來說,用delete不如用truncate 速度快,因為truncate 不用訪問整個表,不用記錄資料的變動。

sqlite雖然不支程式設計客棧持truncate,但它對delete做了優化:

通常在清空表的時候,還需要把自增列歸零。在sqlite中定義自增列的方法如下:

複製** **如下:

create table tablename ( id integer primary key autoincrement, name varchar, type integer );

當sqlite資料庫中包含自增列時,會自動建立乙個名為 sqlite_sequence 的表。

這個表包含兩個列:name和seq。name記錄自增列所在的表,seq記錄當前序號(下一條記錄的編號就是當前序號加1)。

如果想把某個自增列的序號歸零,只需要修改 sqlite_sequence表就可以了。

複製** **如下:

update sqlite_sequence set seq = 0 where name='tablename';

也可以直接把該記錄刪掉:      

複製** **如下:

delete from sqlite_sequence where name='tablename';

要想將所有表的自增列都歸零,直接清空sqlite_sequence表就可以了:

複製** **如下:

delete from sqlite_sequence;

二、sqlite中integer primary key autoincrement和rowid的使用

在用sqlite設計表時,突然想到乙個問題,就是我設計的表中,每個表都有乙個自己的整形id值作為主鍵,

其實可以不指定這麼乙個id值,sqlite內部本來就會為每個表加上乙個 rowid,這個rowid可以當成乙個隱含的字段使用,

為什麼不直接使用這個內部的rowid作為每個表的id主鍵呢。

使用自增長字段為主鍵有不少問題,比如維護或是在大型分布應用中主鍵衝突的解決等。

在一些大型分布應用中主鍵一般選用guid,這可以有效的避免主鍵衝突,減少對主鍵維護的工程。

當然,對於中小型的應用,自增長欄位的好處更多一些,簡單、快速。

sqlite中,乙個自增長字段定義為 integer primary key autoincrement

那麼在插入乙個新資料時,只需要將這個欄位的值指定為null,即可由引擎自動設定其值,

引擎會設定為最大的rowid+1 當然,也可以設定為非null的數字來自己指定這個值,但這樣就必須自己小心,不要引起衝突。

rowid的新值會這個最大數之前隨機找乙個沒被使用了的值。所以在rowid達到最大值前,rowid的值是嚴格單調增加的。

integer primary key autoincrement 自增長欄位的演算法與rowid稍微有些不同。

第一,在達到最大值後,rowid會找已被刪除的字段對應的rowid作為新值,而自增長欄位則會丟出乙個sqlite_full的錯誤。

第二,自增長欄位在增加新值時,是找乙個從沒被使用過的rowid作為新值,而rowid則是找最大已存在的rowid+1。

這裡對應用的影響會比較大,尤其是一些對id值有依賴的元記錄,只適合使用自增長欄位而不能用rowid。

比如,我們設計乙個元記錄表:

複製** **如下:

create table meta_struct(id integer primary key autoincrement, name varchar, type integer)www.cppcns.com;

然後,定義乙個一級表,來描述其它表的結構:

複製** **如下:

create table meta_table(tableid integer, table_field integer)

最後程式設計客棧,我們的應用可以根據這個一級表來產生實際使用的二級表。

這樣為保證相容性meta_struct中的id必須是唯一的,如果有字段被刪除,也不能重複使用這個欄位的id值,不然,在資料庫合併時,

一級表和二級表就會混亂。所以meta_struct表中的主鍵只能使用自增長字段,而不能用rowid。

第三,使用自增長字段,引擎會自動產生乙個sqlite_sequence表,用於記錄每個表的自增長欄位的已使用的最大值,使用者可以看到,

並可wogfiny**k以用使用update、delete和insert操作,但不建議這麼使用,這會讓引擎混亂。如果使用rowid,也會有這麼乙個內部表,使用者可以維護rowid值,但看不到。

本文位址: /shujuku/sqlite/108446.html

sqlite3建立自增主鍵,以及清空表使自增列歸零

1.建立自增主鍵 create table tb python id integer primary key autoincrement,title text,url text 2.清空表 sqlite3資料庫中包含自增列時,會自動建立乙個名為 sqlite sequence 的表。這個表包含兩個列...

SQLite3中自增主鍵歸零方法

當sqlite資料庫中包含自增列時,會自動建立乙個名為 sqlite sequence 的表。這個表包含兩個列 name和seq。name記錄自增列所在的表,seq記錄當前序號 下一條記錄的編號就是當前序號加1 如果想把某個自增列的序號歸零,只需要修改 sqlite sequence表就可以了。up...

SQLite3中自增主鍵歸零方法

當sqlite資料庫中包含自增列時,會自動建立乙個名為 sqlite sequence 的表。這個表包含兩個列 name和seq。name記錄自增列所在的表,seq記錄當前序號 下一條記錄的編號就是當前序號加1 如果想把某個自增列的序號歸零,只需要修改 sqlite sequence表就可以了。up...