自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

SQLite AUTOINCREMENT你需要懂得知識

數(shù)據(jù)庫 其他數(shù)據(jù)庫
AUTOINCREMENT關(guān)鍵字會(huì)占用額外的CPU,內(nèi)存,磁盤空間和磁盤I / O開銷,如果不是嚴(yán)格需要,應(yīng)該避免使用。通常情況下,是不需要它。

1. 總結(jié)

  • AUTOINCREMENT關(guān)鍵字會(huì)占用額外的CPU,內(nèi)存,磁盤空間和磁盤I / O開銷,如果不是嚴(yán)格需要,應(yīng)該避免使用。通常情況下,是不需要它。
  • 在SQLite中,類型為INTEGER PRIMARY KEY的列是ROWID的別名 (WITHOUT ROWID表除外),它始終是64位有符號整數(shù)。
  • 在INSERT上,如果未明確給出ROWID或INTEGER PRIMARY KEY列的值,則它將自動(dòng)填充未使用的整數(shù),通常比當(dāng)前使用的最大ROWID多一個(gè)。無論是否使用AUTOINCREMENT關(guān)鍵字,都是如此。
  • 如果AUTOINCREMENT關(guān)鍵字出現(xiàn)在INTEGER PRIMARY KEY之后,則會(huì)更改自動(dòng)ROWID分配算法,以防止在數(shù)據(jù)庫的生命周期內(nèi)重用ROWID。換句話說,AUTOINCREMENT的目的是防止從先前刪除的行重用ROWID。

[[273909]]

2. 背景

在SQLite中,表行通常具有64位有符號整數(shù)ROWID ,它在同一個(gè)表中的所有行中是唯一的。(沒有ROWID表是例外。)

你可以使用特殊列名稱ROWID,_ROWID_或OID之一,來訪問SQLite表的ROWID。除非你聲明普通表列使用其中一個(gè)特殊名稱,否則使用該名稱將引用聲明的列而不是內(nèi)部ROWID。

如果表包含INTEGER PRIMARY KEY類型的列,則該列將成為ROWID的別名。然后,您可以使用四個(gè)不同的名稱中的任何一個(gè)來訪問ROWID,上面描述的原始三個(gè)名稱或給予INTEGER PRIMARY KEY列的名稱。所有這些名稱都是彼此的別名,并且在任何情況下都能同樣有效。

將新行插入SQLite表時(shí),可以將ROWID指定為INSERT語句的一部分,也可以由數(shù)據(jù)庫引擎自動(dòng)指定。要手動(dòng)指定ROWID,只需將其包含在要插入的值列表中即可。例如:

  1. CREATE TABLE test1(INT,b TEXT); 
  2. INSERT INTO test1(rowid,a,b)VALUES(123,5,'hello'); 

如果在插入上未指定ROWID,或者指定的ROWID的值為NULL,則會(huì)自動(dòng)創(chuàng)建適當(dāng)?shù)腞OWID。通常的算法是為新創(chuàng)建的行提供一個(gè)ROWID,該ROWID比插入前表中的最大ROWID大一個(gè)。如果表最初為空,則使用ROWID為1。如果最大的ROWID等于最大可能的整數(shù)(9223372036854775807),則數(shù)據(jù)庫引擎隨機(jī)開始隨機(jī)選擇正候選ROWID,直到找到之前未使用過的ROWID。如果在合理的嘗試次數(shù)后找不到未使用的ROWID,則插入操作將失敗,并顯示SQLITE_FULL錯(cuò)誤。如果未顯式插入負(fù)ROWID值,則自動(dòng)生成的ROWID值將始終大于零。

只要你從不使用最大ROWID值,而且不刪除具有最大ROWID的表中的條目,上述常規(guī)ROWID選擇算法將生成單調(diào)遞增的唯一ROWID。如果您刪除行或者創(chuàng)建了具有最大可能ROWID的行,則在創(chuàng)建新行時(shí)可能會(huì)重復(fù)使用先前刪除的行中的ROWID,并且新創(chuàng)建的ROWID可能不會(huì)嚴(yán)格按升序排列。

3. AUTOINCREMENT關(guān)鍵字

如果列的類型為INTEGER PRIMARY KEY AUTOINCREMENT,則使用稍微不同的ROWID選擇算法。為新行選擇的ROWID至少比同一個(gè)表中以前存在的最大ROWID大一個(gè)。如果表之前從未包含任何數(shù)據(jù),則使用ROWID為1。如果先前已插入最大可能的ROWID,則不允許新的INSERT,并且任何插入新行的嘗試都將失敗,并出現(xiàn)SQLITE_FULL錯(cuò)誤。僅考慮已提交的先前事務(wù)中的ROWID值。回滾的ROWID值將被忽略,可以重復(fù)使用。

SQLite內(nèi)部使用名為“ sqlite_sequence ” 的內(nèi)部表跟蹤最大的ROWID 。每當(dāng)創(chuàng)建包含AUTOINCREMENT列的普通表時(shí),都會(huì)自動(dòng)創(chuàng)建并初始化sqlite_sequence表??梢允褂闷胀ǖ腢PDATE,INSERT和DELETE語句修改sqlite_sequence表的內(nèi)容。但是對此表進(jìn)行修改可能會(huì)擾亂AUTOINCREMENT密鑰生成算法。在進(jìn)行此類更改之前,請確保你知道自己在做什么。sqlite_sequence表不跟蹤與UPDATE語句關(guān)聯(lián)的ROWID更改,僅跟蹤INSERT語句。

AUTOINCREMENT關(guān)鍵字實(shí)現(xiàn)的行為與默認(rèn)行為略有不同。使用AUTOINCREMENT,具有自動(dòng)選擇的ROWID的行可以保證具有以前從未在同一數(shù)據(jù)庫中使用同一個(gè)表的ROWID。并且自動(dòng)生成的ROWID保證單調(diào)遞增。這些是某些應(yīng)用中的重要屬性。但是,如果你的應(yīng)用程序不需要這些屬性,應(yīng)該保持默認(rèn)行為,因?yàn)槭褂肁UTOINCREMENT需要在插入每一行時(shí)執(zhí)行其他工作,從而導(dǎo)致INSERT運(yùn)行速度稍慢。

請注意,“單調(diào)增加”并不意味著ROWID總是增加一個(gè)。一個(gè)是通常的增量。但是,如果插入因(例如)唯一性約束而失敗,則失敗的插入嘗試的ROWID可能不會(huì)在后續(xù)插入中重用,從而導(dǎo)致ROWID序列中出現(xiàn)間隙。AUTOINCREMENT保證自動(dòng)選擇的ROWID將增加但不是它們將是連續(xù)的。

由于AUTOINCREMENT關(guān)鍵字更改了ROWID選擇算法的行為,因此不允許在WITHOUT ROWID表或INTEGER PRIMARY KEY以外的任何表列上使用AUTOINCREMENT 。任何在WITHOUT ROWID表或INTEGER PRIMARY KEY列以外的列上使用AUTOINCREMENT的嘗試都會(huì)導(dǎo)致錯(cuò)誤。

責(zé)任編輯:趙寧寧 來源: 技術(shù)原理君
相關(guān)推薦

2023-10-08 13:42:43

AIChatGPT

2012-08-11 22:34:06

電子郵件

2009-11-19 14:52:37

Oracle UNIO

2010-03-16 13:57:57

云計(jì)算技術(shù)

2010-03-10 15:06:44

2016-03-28 13:39:58

戴爾

2016-10-13 18:03:13

云計(jì)算PaaSIaaS

2016-03-28 13:45:14

硬盤

2009-11-18 18:19:49

Oracle.Net

2016-12-26 13:46:25

Java反射機(jī)制總結(jié)

2022-10-26 07:21:15

網(wǎng)絡(luò)視頻開發(fā)

2021-04-14 14:46:13

前端Chrome插件

2021-09-07 19:18:20

大數(shù)據(jù)大數(shù)據(jù)應(yīng)用

2022-12-27 14:18:45

K8S命令

2019-11-21 10:59:16

IPv4IPv6網(wǎng)絡(luò)

2013-01-06 09:52:43

SQLite

2013-04-09 16:04:06

iOS開發(fā)SQLite知識總結(jié)

2021-05-11 17:35:41

Windows微軟安全

2019-12-23 11:02:12

HTTP請求頭網(wǎng)絡(luò)協(xié)議

2018-09-25 16:31:35

維諦技術(shù)
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號