摘自:https://www.sqlite.org/withoutrowid.html#wtu
創(chuàng)新互聯(lián)專(zhuān)注于科爾沁網(wǎng)站建設(shè)服務(wù)及定制,我們擁有豐富的企業(yè)做網(wǎng)站經(jīng)驗(yàn)。 熱誠(chéng)為您提供科爾沁營(yíng)銷(xiāo)型網(wǎng)站建設(shè),科爾沁網(wǎng)站制作、科爾沁網(wǎng)頁(yè)設(shè)計(jì)、科爾沁網(wǎng)站官網(wǎng)定制、重慶小程序開(kāi)發(fā)服務(wù),打造科爾沁網(wǎng)絡(luò)公司原創(chuàng)品牌,更為您提供科爾沁網(wǎng)站排名全網(wǎng)營(yíng)銷(xiāo)落地服務(wù)。
?
1.0介紹
默認(rèn)情況下,SQLite數(shù)據(jù)庫(kù)中的每一行都會(huì)有一個(gè)叫做rowid的特殊列,該列唯一標(biāo)識(shí)數(shù)據(jù)庫(kù)表中的某一行。然而如果在CREATE TABLE語(yǔ)句的后面添加WITHOUT ROWID關(guān)鍵字,就會(huì)禁用rowid這一列。有時(shí)候省略掉rowid,能夠帶來(lái)空間和性能上的提升。
1.1 語(yǔ)法
現(xiàn)在創(chuàng)建一個(gè)WITHOUT ROWID的表,最直接的方式就是在CREATE TABLE 語(yǔ)句之后添加關(guān)鍵字WITHOUT ROWID.例如:
CREATE TABLE IF NOT EXISTS wordcount(
? word TEXT PRIMARY KEY,
? cnt INTEGER
) WITHOUT ROWID;
如其他所有的SQL語(yǔ)法一樣,關(guān)鍵字的大小寫(xiě)不敏感。如下的任何一種方式都可以接受:
WITHOUT rowid , withoutrowid , WIThOut rOwId .她們代表一個(gè)意思。
?
注意:如果表指定了WITHOUT ROWID屬性,表必須指定PRIMARY KEY。否則創(chuàng)建表的時(shí)候,會(huì)返回錯(cuò)誤,錯(cuò)誤的大體意思是指定WITHOUT ROWID的創(chuàng)建表語(yǔ)句缺少PRIMARY KEY。
?
大多數(shù)情況下,rowid和oid或者_(dá)rowid_代表一個(gè)意思。然而只有rowid才可以出現(xiàn)在創(chuàng)建表的語(yǔ)句當(dāng)中。
?
1.2兼容性
只有SQLite 3.8.2版本之后的程序才可以使用WITHOUT ROWID關(guān)鍵字。早期版本的SQLite打開(kāi)攜帶WITHOUT ROWID屬性的表,將會(huì)返回一個(gè)malformed database schema 的錯(cuò)誤。
?
1.3 Quirks(特殊性)
迄今為止,WITHOUT ROWID 只能夠被SQLite數(shù)據(jù)庫(kù)使用,其他的數(shù)據(jù)庫(kù)引擎并沒(méi)有兼容該關(guān)鍵字。在正統(tǒng)的系統(tǒng)中,即使沒(méi)有WITHOUT ROWID關(guān)鍵字,所有的表也應(yīng)該表現(xiàn)的和WITHOUT ROWID的效果一樣。然而,SQLite在一開(kāi)始被設(shè)計(jì)的時(shí)候,就采用整型的ROWID來(lái)簡(jiǎn)化實(shí)現(xiàn)的方式。這種方法表現(xiàn)很好很多年了。但是隨著SQLite的需求的增長(zhǎng),(the need for tables in which the PRIMARY KEY really did correspondto the underlying row key grew more acute)對(duì)于表指定PRIMARY KEY屬性變得更加迫切,因此和rowkey的矛盾更加尖銳。為了兼容過(guò)去的已經(jīng)被使用了很久很久的程序,因此without rowid的概念終于被添加到SQLite中,(The WITHOUT ROWID concept was added in order to meet that needwithout breaking backwards compatibility with the billions of SQLite databasesalready in use at the time (circa 2013).)
為了無(wú)縫的兼容過(guò)去成千上萬(wàn)的程序,WITHOUT ROWID的概念被添加到SQLite中。
2.0 與攜帶Rowid表不同之處
WITHOUT ROWID是一個(gè)優(yōu)化選項(xiàng)。她沒(méi)有提供任何新的特性(capablilities).操作攜帶ROWID表和操作不攜帶ROWID的表,使用的都是相同的語(yǔ)法。唯一的優(yōu)點(diǎn)是節(jié)省磁盤(pán)空間,并且比普通的表快一些。
?
多數(shù)情況下,攜帶rowid表和不攜帶rowid表是可以互換的(interchangeable).但是WITHOUT ROWID表存在一些限制,而這些限制是普通的rowid表不具備的。
?
1.指定了WITHOUT ROWID的表必須指定PRIMARYKEY, 否則建表失敗
2指定了WITHOUT ROWID的表不能夠指定INTEGERPRIMARY KEY。In an ordinary table, "INTEGER PRIMARY KEY" means that thecolumn is an alias for the rowid. But since there is no rowid in a WITHOUTROWID table, that special meaning no longer applies. An "INTEGER PRIMARYKEY" column in a WITHOUT ROWID table works like an "INT PRIMARYKEY" column in an ordinary table: It is a PRIMARY KEY that has integeraffinity.
3 指定了WITHOUT ROWID的表不能使用AUTOINCREMENT關(guān)鍵字