中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

SQLite 遞增主鍵 (Autoincrement)

發布時間:2020-08-06 14:46:04 來源:網絡 閱讀:503 作者:fengyuzaitu 欄目:數據庫

翻譯:https://www.sqlite.org/autoinc.html
?
概述
1 自增主鍵(TheAUTOINCREMENT keyword)占用額外CPU,內存,磁盤空間,并且增加磁盤I/O的開銷(disk I/O overhead),所以如無必要,應該禁用。通常情況下是不需要的。
2 SQLite中,指定其中的一列的屬性為INTEGERPRIMARY KEY,和指定為ROWID,效果是一樣的(an alias for the ROWID),(除非在創建表的時候,指定了WITHOUT_ROWID),存儲類型是64位符號整型。
3 在插入操作中,如果ROWID或者INTEGERPRIMARY KEY列沒有指定值,SQLITE將會自動填充一個沒有使用的整型,通常大于已經使用的任何一個ROWID值。不管是否已經指定了AUTOINCREMENT關鍵字,效果還是一樣。
4 如果AUTOINCREMENT關鍵字緊隨INTEGEPRIMARY KEY關鍵字,將會改變ROWID的分配算法,不再使用已經被使用的ROWID值,換句話說,就是AUTOINCREMENT將阻止ROWID的重用,盡管該ROWID已經隨著某一行的數據刪除,而沒有被使用。
?
背景
對于SQLite來說,每一個表的每一行都會有一個64位符號整型ROWID,該ROWID在該表中唯一表示(指定了WITHOUT_ROWID表例外)
?
你可以通過特殊的列名(如ROWID,_ROWID,或者OID)訪問SQLITE表中的ROWID的值。除非你在表中定義了與上述相同名稱的列名,如果真的定義了,該名字將只會應用到定義的列而不是內置的ROWID.
?
如果表中有定義為INTEGER PRIMARY KEY的屬性列,將產生和ROWID同樣的效果(an alias for),我想翻譯成別名,但是或許沒有人理解。這個時候,可以通過四種不同的方式訪問ROWID,前三種方式請參考前面一段話,最后一種方式自然是指定了INTEGER PRIMARY KEY屬性的那一列!!都是別名而已。
?
當一新行將被插入到SQLITE表中,ROWID可以在插入語句中指定,或者讓數據庫引擎自動賦值。手動指定ROWID的例子如下:
CREATE TABLE test1(a INT, b TEXT);
INSERT INTO test1(rowid, a, b) VALUES(123, 5,'hello');
?
如果在插入語句中沒有指定ROWID,或者ROWID指定了一個NULL值,數據庫引擎會自定指定一個合適的ROWID值。通用的算法將創建一個新的ROWID,這個值比以前分配的任何ROWID值都大,反映了增長的情況。如果表為空,ROWID就會被指定為1.If the largest ROWID is equal to the largest possibleinteger (9223372036854775807) then the database engine starts picking positivecandidate ROWIDs at random until it finds one that is not previously used.
如果沒有找到一個未曾使用的ROWID值,插入操作將會以失敗告終,并且返回一個SQLITE_FULL錯誤碼!如果ROWID沒有在插入語句中顯示指定,自動生成的ROWID值總是比0大。
?
正常的ROWID選擇算法會產生單調遞增并且唯一的ROWID,只要你沒有使用最大的ROWID值,并且也從來沒有刪除最大的ROWID數據列。如果你刪除某些行,或者你曾經創建一個最大的ROWID值,之前被刪除行使用的ROWID,可能被新插入的行重用。
?
自增主鍵
如果某一屬性列指定了INTEGER PRIMARY KEYAUTOINCREMENT屬性,ROWID選取算法會稍微不同。產生的ROWID比表中已經存在的記錄中的ROWID都大。如果之前表為空,那么ROWID就會分配數值1.如果用戶指定了ROWID的值是最大值,接下來就不會允許任何的插入操作,與此同時,任何的插入操作都會返回SQLITE_FULL的錯誤碼。Only ROWID values frompreviously transactions that were committed are considered. ROWID values thatwere rolled back are ignored and can be reused.
?
SQLite在內部維護了一個名字叫“sqlite_sequence”的表,記錄了一個表已經使用的最大ROWID.不管一個表有沒有指定AUTOINCREMENT列的屬性值,該表都會被自動創建,然后進行初始化。該表也可以通過一般的UPDATE,INSERT和DELETE語句進行編輯修改。但是修改該表會影響到AUTOINCREMENT生成算法。當你修改的時候,請確保你知道自己正在干嘛!!
?
指定AUTOINCREMENT關鍵字的實現和默認的實現有所不同。對于AUTOINCREMENT,每列得到的ROWID值對于相同的數據庫相同的表來說,都是未曾使用的。生成的ROWID單調遞增。對于某些應用這是非常重要的屬性。但是如果你的應用程序不需要這些屬性,你可以直接采用默認的方式,而不是指定AUTOINCREMENT。畢竟AUTOINCREMENT在插入的過程中需要做一些額外的工作,導致插入的速度有所緩慢。
?
請注意單調遞增并不意味著ROWID總是加1(increases by exactly one).增1是最常見的。但是如果在插入的過程中失敗了,被分配的ROWID不會被接下來的插入數據重用到,導致了ROWID序列出現缺口。AUTOINCREMENT確保了ROWID是自動遞增的,但是沒有保證是連續遞增的。
?
因為AUTOINCREMENT關鍵字改變了ROWID的選取算法,所以AUTOINCREMENT不能應用在指定了WITHOUT_ROWID的表或者指定了其他的列為INTEGER PRIMARYKEY.任何嘗試應用AUTOINCREMENT關鍵字在上面兩種情況下都會導致錯誤。
注意:
1)指定了WITHOUT_ROWID屬性,就不能再使用AUTOINCREMENT
2) 如果已經有表中的某一列指定了INTEGER PRIMARY KEY屬性,AUTOINCREMENT不能修飾表的其他任何一列。

如下是擴展閱讀:
摘自:http://www.jb51.net/article/50049.htm
針對于用戶使用自定義的自增主鍵,還是系統內部維護的ROWID,上面已經描述的非常清楚,并且鏈接也已經提供了操作ROWID的方法。
現在重點討論:在大型的分布式應用中,自增主鍵的使用,當然SQLite數據只能夠是一只麻雀,對于我們來說,完全沒有任何的大數據量的概念,針對于作者提及的一級表以及二級表的使用概念,有著深遠的好奇,但是目前沒有任何的操作環境。
摘自文中:使用自增長字段為主鍵有不少問題,比如維護或是在大型分布應用中主鍵沖突的解決等。
在一些大型分布應用中主鍵一般選用guid,這可以有效的避免主鍵沖突,減少對主鍵維護的工程。
當然,對于中小型的應用,自增長字段的好處更多一些,簡單、快速。
??? 采用自增主鍵的理由,在什么情況下,需要建立一個主鍵,尤其是分布式數據庫!!


向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

广水市| 绥江县| 乐至县| 兰考县| 正宁县| 巴彦淖尔市| 凤凰县| 巴塘县| 汕尾市| 象山县| 慈溪市| 桐庐县| 大英县| 辽阳县| 阳朔县| 泾川县| 维西| 永安市| 怀集县| 油尖旺区| 文登市| 襄城县| 双流县| 聂荣县| 台湾省| 青神县| 德庆县| 江西省| 顺平县| 大同市| 屏山县| 荥阳市| 灵石县| 花莲县| 光泽县| 称多县| 卫辉市| 聂荣县| 太和县| 金阳县| 沙洋县|