sqlite3自增key設定(建立自增字段)

在用sqlite設計表時,每一個表都有一個本身的整形id值做爲主鍵,其實能夠不指定這麼一個id值,sqlite內部原本就會爲每一個表加上一個 rowid,這個rowid能夠當成一個隱含的字段使用,可是由sqlite引擎來維護的,在3.0之前rowid是32位的整數,3.0之後是 64位的整數,爲何不直接使用這個內部的rowid做爲每一個表的id主鍵呢。 html

相關的文檔在這裏:?http://www.sqlite.org/autoinc.html?http://www.sqlite.org/faq.html 算法

 

用指定INTEGER PRIMARY KEY AUTOINCREMENT 和不指定自增加字段用rowid有什麼區別: sql

使用自增加字段爲主鍵有很多問題,好比維護或是在大型分佈應用中主鍵衝突的解決等。在一些大型分佈應用中主鍵通常選用guid,這能夠有效的避免主鍵衝突,減小對主鍵維護的工程。固然,對於中小型的應用,自增加字段的好處更多一些,簡單、快速。 函數

Sqlite中,一個自增加字段定義爲INTEGER PRIMARY KEY AUTOINCREMENT,那麼在插入一個新數據時,只須要將這個字段的值指定爲NULL,便可由引擎自動設定其值,引擎會設定爲最大的rowid+1。固然,也能夠設置爲非NULL的數字來本身指定這個值,但這樣就必須本身當心,不要引發衝突。當這個rowid的值大於所能表達的最大值 9223372036854775807 (3.0及之後版本的rowid最大值)後,rowid的新值會這個最大數以前隨機找一個沒被使用了的值。因此在rowid達到最大值前,rowid的值是嚴格單調增長的。
INTEGER PRIMARY KEY AUTOINCREMENT 自增加字段的算法與rowid稍微有些不一樣。
 第一,在達到最大值後,rowid會找已被刪除的字段對應的rowid做爲新值,而自增加字段則會丟出一個SQLITE_FULL的錯誤。
 第二,自增加字段在增長新值時,是找一個從沒被使用過的rowid做爲新值,而rowid則是找最大已存在的rowid+1。這裏對應用的影響會比較大,尤爲是一些對id值有依賴的元記錄,只適合使用自增加字段而不能用rowid。
 
 好比,咱們設計一個元記錄表:
drop table test;
create table test (
    [tkid]            integer PRIMARY KEY autoincrement,                -- 設置主鍵
    [tktype]          int default 0,
    [tableid]         varchar (50),
    [createdate]      datetime default (datetime('now', 'localtime'))    -- 時間
); ui


 第三,使用自增加字段,引擎會自動產生一個sqlite_sequence表,用於記錄每一個表的自增加字段的已使用的最大值,用戶能夠看到,並能夠用使用 Update、Delete和Insert操做,但不建議這麼使用,這會讓引擎混亂。若是使用rowid,也會有這麼一個內部表,用戶能夠維護rowid 值,但看不到。
這麼看來,若是直接使用rowid來代替自增長字段,根據二者的細微的差異,須要注意是否與本身的應用衝突,若是沒有衝突,那麼用rowid會更快一點。 設計

 

SQLite中建立自增字段: sqlite

簡單的回答:一個聲明爲 INTEGER PRIMARY KEY 的字段將自動增長。 htm

從 SQLite 的 2.3.4 版本開始,若是你將一個表中的一個字段聲明爲 INTEGER PRIMARY KEY,那麼不管你什麼時候向該表的該字段插入一個 NULL 值,這個 NULL 值將自動被更換爲比表中該字段全部行的最大值大 1 的整數;若是表爲空,那麼將被更換爲 1。 rem

一個新的API函數 sqlite3_last_insert_rowid() 返回最近的插入操做的整形鍵. 文檔

注意這個整型鍵始終比以前插入表中的最後一個鍵大1。新鍵相對於表中的已有鍵來講是惟一的,但它可能與以前從表中刪除的鍵值重疊。要始終獲得在整個表中惟一的鍵,在INTEGER PRIMARY KEY的聲明以前加關鍵詞AUTOINCREMENT.這樣被選的鍵將老是比表中已存在的最大鍵大1。若可能的最大鍵已存在於表中,INSERT操做將失敗並返回一個SQLITE_FULL錯誤碼.

相關文章
相關標籤/搜索