最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

SQLite3中自增主鍵相關(guān)知識總結(jié)

 更新時間:2014年05月13日 09:11:19   作者:  
這篇文章主要介紹了SQLite3中自增主鍵相關(guān)知識總結(jié),清零的方法、INTEGER PRIMARY KEY AUTOINCREMENT和rowid的使用等,需要的朋友可以參考下

一、SQLite清空表并將自增列歸零

SQL標準中有TRUNCATE TABLE語句,用來清空表的所有內(nèi)容。
但SQLite不支持這個語句。在SQLite中直接使用 DELETE FROM TableName 就可以了。
對于大多數(shù)DBMS來說,用DELETE不如用TRUNCATE 速度快,因為TRUNCATE 不用訪問整個表,不用記錄數(shù)據(jù)的變動。

SQLite雖然不支持TRUNCATE,但它對DELETE做了優(yōu)化:
通常在清空表的時候,還需要把自增列歸零。在SQLite中定義自增列的方法如下:

復制代碼 代碼如下:
CREATE TABLE TableName ( id INTEGER PRIMARY KEY AUTOINCREMENT, name varchar, type Integer );

當SQLite數(shù)據(jù)庫中包含自增列時,會自動建立一個名為 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內(nèi)部本來就會為每個表加上一個 rowid,這個rowid可以當成一個隱含的字段使用,

為什么不直接使用這個內(nèi)部的rowid作為每個表的id主鍵呢。
使用自增長字段為主鍵有不少問題,比如維護或是在大型分布應用中主鍵沖突的解決等。
在一些大型分布應用中主鍵一般選用guid,這可以有效的避免主鍵沖突,減少對主鍵維護的工程。
當然,對于中小型的應用,自增長字段的好處更多一些,簡單、快速。

Sqlite中,一個自增長字段定義為 INTEGER PRIMARY KEY AUTOINCREMENT
那么在插入一個新數(shù)據(jù)時,只需要將這個字段的值指定為NULL,即可由引擎自動設定其值,
引擎會設定為最大的rowid+1 當然,也可以設置為非NULL的數(shù)字來自己指定這個值,但這樣就必須自己小心,不要引起沖突。

rowid的新值會這個最大數(shù)之前隨機找一個沒被使用了的值。所以在rowid達到最大值前,rowid的值是嚴格單調(diào)增加的。
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);

然后,定義一個一級表,來描述其它表的結(jié)構(gòu):
復制代碼 代碼如下:
Create table meta_table(tableid INTEGER, table_field integer)

最后,我們的應用可以根據(jù)這個一級表來產(chǎn)生實際使用的二級表。
這樣為保證兼容性meta_struct中的id必須是唯一的,如果有字段被刪除,也不能重復使用這個字段的id值,不然,在數(shù)據(jù)庫合并時,
一級表和二級表就會混亂。所以meta_struct表中的主鍵只能使用自增長字段,而不能用rowid。

第三,使用自增長字段,引擎會自動產(chǎn)生一個sqlite_sequence表,用于記錄每個表的自增長字段的已使用的最大值,用戶可以看到,
并可以用使用Update、Delete和Insert操作,但不建議這么使用,這會讓引擎混亂。如果使用rowid,也會有這么一個內(nèi)部表,用戶可以維護rowid值,但看不到。

相關(guān)文章

  • SQLite3 API 編程手冊

    SQLite3 API 編程手冊

    Sqlite3 的確很好用。小巧、速度快。但是因為非微軟的產(chǎn)品,幫助文檔總覺得不夠。這些天再次研究它,又有一些收獲,這里把我對 sqlite3 的研究列出來,以備忘記
    2013-12-12
  • System.Data.SQLite 數(shù)據(jù)庫詳細介紹

    System.Data.SQLite 數(shù)據(jù)庫詳細介紹

    System.Data.SQLite是SQLite的加強版,它可以無需.NET Framework支持,由于它內(nèi)部包含了一個ADO.NET 2.0引擎,所以.NET開發(fā)人員可以利用System.Data.SQLite方便地開發(fā).NET程序。
    2011-02-02
  • SQLite教程(一):SQLite數(shù)據(jù)庫介紹

    SQLite教程(一):SQLite數(shù)據(jù)庫介紹

    這篇文章主要介紹了SQLite教程(一):SQLite數(shù)據(jù)庫介紹,本文講解了什么是SQLite、SQLite的主要優(yōu)點、和RDBMS相比SQLite的一些劣勢、個性化特征等內(nèi)容,需要的朋友可以參考下
    2015-05-05
  • 為SQLite3提供一個ANSI到UTF8的互轉(zhuǎn)函數(shù)

    為SQLite3提供一個ANSI到UTF8的互轉(zhuǎn)函數(shù)

    這篇文章主要為大家分享下ANSI與UTF8的互轉(zhuǎn)函數(shù),需要的朋友可以收藏下
    2013-12-12
  • python之sqlalchemy創(chuàng)建表的實例詳解

    python之sqlalchemy創(chuàng)建表的實例詳解

    這篇文章主要介紹了數(shù)據(jù)庫之sqlalchemy創(chuàng)建表的實例詳解的相關(guān)資料,希望通過本文能幫助到大家,讓大家掌握理解這部分內(nèi)容,需要的朋友可以參考下
    2017-10-10
  • SQLite教程(十三):C語言編程實例代碼(1)

    SQLite教程(十三):C語言編程實例代碼(1)

    這篇文章主要介紹了SQLite教程(十三):C語言編程實例代碼(1),本文講解了獲取表的Schema信息、動態(tài)創(chuàng)建表、刪除該表、常規(guī)數(shù)據(jù)插入、創(chuàng)建測試數(shù)據(jù)表、刪除測試表等內(nèi)容,需要的朋友可以參考下
    2015-05-05
  • Sqlite 常用函數(shù) 推薦

    Sqlite 常用函數(shù) 推薦

    Sqlite 常用函數(shù),在實際開發(fā)中,經(jīng)常遇的到。
    2009-09-09
  • SQLite3中自增主鍵相關(guān)知識總結(jié)

    SQLite3中自增主鍵相關(guān)知識總結(jié)

    這篇文章主要介紹了SQLite3中自增主鍵相關(guān)知識總結(jié),清零的方法、INTEGER PRIMARY KEY AUTOINCREMENT和rowid的使用等,需要的朋友可以參考下
    2014-05-05
  • SQLite教程(十四):C語言編程實例代碼(2)

    SQLite教程(十四):C語言編程實例代碼(2)

    這篇文章主要介紹了SQLite教程(十四):C語言編程實例代碼(2),本文講解了高效的批量數(shù)據(jù)插入和數(shù)據(jù)查詢代碼實例,需要的朋友可以參考下
    2015-05-05
  • SQLite 內(nèi)存數(shù)據(jù)庫學習手冊

    SQLite 內(nèi)存數(shù)據(jù)庫學習手冊

    這篇文章主要介紹SQLite 內(nèi)存數(shù)據(jù)庫的使用方法, 需要的朋友可以參考下
    2013-12-12

最新評論

丹东市| 化隆| 抚松县| 绍兴市| 静乐县| 奉新县| 阿巴嘎旗| 和林格尔县| 宜章县| 玉环县| 巨鹿县| 凤翔县| 从化市| 汝阳县| 红桥区| 小金县| 乌拉特中旗| 宁国市| 宽甸| 马公市| 汝南县| 凤庆县| 陇川县| 康保县| 龙南县| 马尔康县| 太原市| 交口县| 吐鲁番市| 红安县| 阳江市| 额尔古纳市| 福建省| 抚远县| 罗源县| 凤凰县| 闽清县| 土默特左旗| 湖南省| 义马市| 莱西市|