宣告為
integer primary key
的列被認為是自增長的
在用sqlite設計表時,突然想到乙個問題,就是我設計的表中,每個表都有一 個自己的整形id值作為主鍵,其實可以不指定這麼乙個id值,sqlite內部本來就會為每個表加上乙個 rowid,這個rowid可以當成乙個隱含的 字段使用,但是由sqlite引擎來維護的,在3.0以前rowid是32位的整數,3.0以後是64位的整數,為什麼不直接使用這個內部的rowid作 為每個表的id主鍵呢。
想到就立即先查詢一下sqlite的文件,看看用指定integer primary key autoincrement 和不指定自增長欄位用rowid有什麼區別。相關的文件在這裡:
使用自增長字段為主鍵有不少問題,比如維護或是在大型分布應用中主鍵衝突的解決等。在一些大型分布應用中主鍵一般選用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。
比如,我們設計乙個元記錄表:
create table meta_struct(id integer primary key autoincrement, name varchar, type integer);
然後,定義乙個一級表,來描述其它表的結構:
create table meta_table(tableid integer, table_field integer)
最後,我們的應用可以根據這個一級表來產生實際使用的二級表。
這樣為保證相容性meta_struct中的id必須是唯一的,如果有字段被刪除,也不能重複使用這個欄位的id值,不然,在資料庫合併時,一級表和二級表就會混亂。所以meta_struct表中的主鍵只能使用自增長字段,而不能用rowid。
第三,使用自增長字段,引擎會自動產生乙個sqlite_sequence表,用於記錄每個表的自增長欄位的已 使用的最大值,使用者可以看到,並可以用使用update、delete和insert操作,但不建議這麼使用,這會讓引擎混亂。如果使用rowid,也會 有這麼乙個內部表,使用者可以維護rowid值,但看不到。
這麼看來,如果直接使用rowid來代替自增加字段,根據兩者的細微的差別,需要注意是否與自己的應用衝突,如果沒有衝突,那麼用rowid會更快一點。
ORACLE自增長列
新建序列 create sequence create sequence q tpa acitive alarms id minvalue 1 maxvalue 99999999999999999 start with 100 increment by 1 cache 100 觸發器 create ...
oracle實現自增長列
1.根據現有表結構t bz bzxx zlyj,將xh設定為自增長 2.建立sequence,如下 建立sequence create sequence t bz bzxx zlyj sequence increment by 1 每次加幾個 start with 1 從1開始計數 nomaxval...
Oracle中建立自增長列
oracle 中建立自增長列 我們都知道,在 mysql 中有乙個列可以設為自動增長的,以此來區別資料行,並且作為其他列查詢該資料的依據。oracle 中如果在乙個基本表中想有乙個自動增長的標示列 id,該怎樣實現呢?方法是這樣的,可以建乙個序列 sequence 設定其屬性從 1開始自動公升序增長...