• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            面對(duì)現(xiàn)實(shí),超越自己
            逆水行舟,不進(jìn)則退
            posts - 269,comments - 32,trackbacks - 0

            SQLite庫(kù)可以解析大部分標(biāo)準(zhǔn)SQL語(yǔ)言。但它也省去了一些特性并且加入了一些自己的新特性。這篇文檔就是試圖描述那些SQLite支持/不支持的SQL語(yǔ)法的。查看關(guān)鍵字列表

            如下語(yǔ)法表格中,純文本用藍(lán)色粗體顯示。非終極符號(hào)為斜體紅色。作為語(yǔ)法一部分的運(yùn)算符用黑色Roman字體表示。

            這篇文檔只是對(duì)SQLite實(shí)現(xiàn)的SQL語(yǔ)法的綜述,有所忽略。想要得到更詳細(xì)的信息,參考源代碼和語(yǔ)法文件“parse.y”。

            SQLite執(zhí)行如下的語(yǔ)法:

            • ALTER TABLE
            • ANALYZE
            • ATTACH DATABASE
            • BEGIN TRANSACTION
            • 注釋
            • COMMIT TRANSACTION
            • COPY
            • CREATE INDEX
            • CREATE TABLE
            • CREATE TRIGGER
            • CREATE VIEW
            • DELETE
            • DETACH DATABASE
            • DROP INDEX
            • DROP TABLE
            • DROP TRIGGER
            • DROP VIEW
            • END TRANSACTION
            • EXPLAIN
            • 表達(dá)式
            • INSERT
            • ON CONFLICT子句
            • PRAGMA
            • REINDEX
            • REPLACE
            • ROLLBACK TRANSACTION
            • SELECT
            • UPDATE
            • VACUUM

             

            ALTER TABLE

            sql-statement ::= ALTER TABLE [database-name .] table-name alteration
            alteration ::= RENAME TO new-table-name
            alteration ::= ADD [COLUMN] column-def

            SQLite版本的的ALTER TABLE命令允許用戶重命名或添加新的字段到已有表中,不能從表中刪除字段。

            RENAME TO語(yǔ)法用于重命名表名[database-name.]table-namenew-table-name。這一命令不能用于在附加數(shù)據(jù)庫(kù)之間移動(dòng)表,只能在同一個(gè)數(shù)據(jù)庫(kù)中對(duì)表進(jìn)行重命名。

            若需要重命名的表有觸發(fā)器或索引,在重命名后它們依然屬于該表。但若定義了視圖,或觸發(fā)器執(zhí)行的語(yǔ)句中有提到 表的名字,則它們不會(huì)被自動(dòng)改為使用新的表名。若要進(jìn)行這一類的修改,則需手工撤銷并使用新的表名重建觸發(fā)器或視圖。

            ADD [COLUMN]語(yǔ)法用于在已有表中添加新的字段。新字段總是添加到已有字段列表的末尾。Column-def可以是CREATE TABLE中允許出現(xiàn)的任何形式,且須符合如下限制:

            • 字段不能有主鍵或唯一約束。
            • 字段不能有這些缺省值:CURRENT_TIME, CURRENT_DATE或CURRENT_TIMESTAMP
            • 若定義了NOT NULL約束,則字段必須有一個(gè)非空的缺省值。

            ALTER TABLE語(yǔ)句的執(zhí)行時(shí)間與表中的數(shù)據(jù)量無(wú)關(guān),它在操作一個(gè)有一千萬(wàn)行的表時(shí)的運(yùn)行時(shí)間與操作僅有一行的表時(shí)是一樣的。

            在對(duì)數(shù)據(jù)庫(kù)運(yùn)行ADD COLUMN之后,該數(shù)據(jù)庫(kù)將無(wú)法由SQLite 3.1.3及更早版本讀取,除非運(yùn)行VACUUM命令。

             

            ANALYZE

             

            sql-statement ::= ANALYZE
            sql-statement ::= ANALYZE database-name
            sql-statement ::= ANALYZE [database-name .] table-name

             

            ANALYZE命令令集合關(guān)于索引的統(tǒng)計(jì)信息并將它們儲(chǔ)存在數(shù)據(jù)庫(kù)的一個(gè)特殊表中,查詢優(yōu)化器可以用該表來(lái)制作更好的索引選擇。若不給出參數(shù),所有附加數(shù)據(jù)庫(kù)中的所有索引被分析。若參數(shù)給出數(shù)據(jù)庫(kù)名,該數(shù)據(jù)庫(kù)中的所有索引被分析。若給出表名 作參數(shù),則只有關(guān)聯(lián)該表的索引被分析。

            最初的實(shí)現(xiàn)將所有的統(tǒng)計(jì)信息儲(chǔ)存在一個(gè)名叫sqlite_stat1的表中。未來(lái)的加強(qiáng)版本中可能會(huì)創(chuàng)建名字類似的其它表,只是把“1”改為其它數(shù)字。sqlite_stat1表不能夠被撤銷,但其中的所有內(nèi)容可以被刪除,這是與撤銷該表等效的行為。

             

            ATTACH DATABASE

            ATTACH DATABASE語(yǔ)句將一個(gè)已存在的數(shù)據(jù)庫(kù)添加到當(dāng)前數(shù)據(jù)庫(kù)連接。若文件名含標(biāo)點(diǎn)符號(hào),則應(yīng)用引號(hào)引起來(lái)。數(shù)據(jù)庫(kù)名’main’和’temp’代表主數(shù)據(jù)庫(kù)和用于存放臨時(shí)表的數(shù)據(jù)庫(kù),它們不能被拆分。拆分?jǐn)?shù)據(jù)庫(kù)使用DETACH DATABASE語(yǔ)句。

            你可以讀寫(xiě)附加數(shù)據(jù)庫(kù),或改變其結(jié)構(gòu)。這是SQLite 3.0提供的新特性。在SQLite 2.8中,改變附加數(shù)據(jù)庫(kù)的結(jié)構(gòu)是不允許的。

            在附加數(shù)據(jù)庫(kù)中添加一個(gè)與已有表同名的表是不允許的。但你可以附加帶有與主數(shù)據(jù)庫(kù)中的表同名的表的數(shù)據(jù)庫(kù)。也可以多次附加同一數(shù)據(jù)庫(kù)。

            使用database-name.table-name來(lái)引用附加數(shù)據(jù)庫(kù)中的表。若附加數(shù)據(jù)庫(kù)中的表與主數(shù)據(jù)庫(kù)的表不重名,則不需加數(shù)據(jù)庫(kù)名作為前綴。當(dāng)數(shù)據(jù)庫(kù)被附加時(shí),它的所有不重名的表成為該名字指向的缺省表。之后附加的任意與之同名的表需要加前綴。若“缺省”表被拆分,則最后附加的同名表變?yōu)?#8220;缺省”表。

            若主數(shù)據(jù)庫(kù)不是“:memory:”,多附加數(shù)據(jù)庫(kù)的事務(wù)是原子的。若主數(shù)據(jù)庫(kù)是“:memory:”則事務(wù)在每個(gè)獨(dú)立文件中依然是原子的。但若主機(jī)在改變兩個(gè)或更多數(shù)據(jù)庫(kù)的COMMIT語(yǔ)句進(jìn)行時(shí)崩潰,則可能一部分文件被改變而其他的保持原樣。附加數(shù)據(jù)庫(kù)的原子性的提交 是SQLite 3.0的新特性。在SQLite 2.8中,所有附加數(shù)據(jù)庫(kù)的提交類似于主數(shù)據(jù)庫(kù)是“:memory:”時(shí)的情況。

            對(duì)附加數(shù)據(jù)庫(kù)的數(shù)目有編譯時(shí)的限制,最多10個(gè)附加數(shù)據(jù)庫(kù)。

             

            BEGIN TRANSACTION

             

            sql-statement ::= BEGIN [ DEFERRED | IMMEDIATE | EXCLUSIVE ] [TRANSACTION [name]]
            sql-statement ::= END [TRANSACTION [name]]
            sql-statement ::= COMMIT [TRANSACTION [name]]
            sql-statement ::= ROLLBACK [TRANSACTION [name]]

             

            從2.0版開(kāi)始,SQLite支持帶有回退和原子性的提交的事務(wù)處理。

            可選的事務(wù)名稱會(huì)被忽略。SQLite目前不允許嵌套事務(wù)。

            在事務(wù)之外,不能對(duì)數(shù)據(jù)庫(kù)進(jìn)行更改。如果當(dāng)前沒(méi)有有效的事務(wù),任何修改數(shù)據(jù)庫(kù)的命令(基本上除了SELECT以外的所有SQL命令)會(huì)自動(dòng)啟動(dòng)一個(gè)事務(wù)。命令結(jié)束時(shí),自動(dòng)啟動(dòng)的事務(wù)會(huì)被提交。

            可以使用BEGIN命令手動(dòng)啟動(dòng)事務(wù)。這樣啟動(dòng)的事務(wù)會(huì)在下一條COMMIT或ROLLBACK命令之前一直有效。但若數(shù)據(jù)庫(kù)關(guān)閉或出現(xiàn)錯(cuò)誤且選用ROLLBACK沖突判定算法時(shí),數(shù)據(jù)庫(kù)也會(huì)ROLLBACK。查看ON CONFLICT子句獲取更多關(guān)于ROLLBACK沖突判定算法的信息。

            在SQLite 3.0.8或更高版本中,事務(wù)可以是延遲的,即時(shí)的或者獨(dú)占的。“延遲的”即是說(shuō)在數(shù)據(jù)庫(kù)第一次被訪問(wèn)之前不獲得鎖。這樣就會(huì)延遲事務(wù),BEGIN語(yǔ)句本身不做任何事情。直到初次讀取或訪問(wèn)數(shù)據(jù)庫(kù)時(shí)才獲取鎖。對(duì)數(shù)據(jù)庫(kù)的初次讀取創(chuàng)建一個(gè)SHARED鎖 ,初次寫(xiě)入創(chuàng)建一個(gè)RESERVED鎖。由于鎖的獲取被延遲到第一次需要時(shí),別的線程或進(jìn)程可以在當(dāng)前線程執(zhí)行BEGIN語(yǔ)句之后創(chuàng)建另外的事務(wù) 寫(xiě)入數(shù)據(jù)庫(kù)。若事務(wù)是即時(shí)的,則執(zhí)行BEGIN命令后立即獲取RESERVED鎖,而不等數(shù)據(jù)庫(kù)被使用。在執(zhí)行BEGIN IMMEDIATE之后,你可以確保其它的線程或進(jìn)程不能寫(xiě)入數(shù)據(jù)庫(kù)或執(zhí)行BEGIN IMMEDIATE或BEGIN EXCLUSIVE,但其它進(jìn)程可以讀取數(shù)據(jù)庫(kù)。獨(dú)占事務(wù)在所有的數(shù)據(jù)庫(kù)獲取EXCLUSIVE鎖,在執(zhí)行BEGIN EXCLUSIVE之后,你可以確保在當(dāng)前事務(wù)結(jié)束前沒(méi)有任何其它線程或進(jìn)程 能夠讀寫(xiě)數(shù)據(jù)庫(kù)。

            有關(guān)SHARED、RESERVED和EXCLUSIVE鎖可以參見(jiàn)這里。

            SQLite 3.0.8的默認(rèn)行為是創(chuàng)建延遲事務(wù)。SQLite 3.0.0到3.0.7中延遲事務(wù)是唯一可用的事務(wù)類型。SQLite 2.8或更早版本中,所有的事務(wù)都是獨(dú)占的。

            COMMIT命令在所有SQL命令完成之前并不作實(shí)際的提交工作。這樣若兩個(gè)或更多個(gè)SELECT語(yǔ)句在進(jìn)程中間而執(zhí)行COMMIT時(shí),只有全部SELECT語(yǔ)句結(jié)束才進(jìn)行提交。

            執(zhí)行COMMIT可能會(huì)返回SQLITE_BUSY錯(cuò)誤代碼。這就是說(shuō)有另外一個(gè)線程或進(jìn)程獲取了數(shù)據(jù)庫(kù)的讀取鎖,并阻止數(shù)據(jù)庫(kù)被改變。當(dāng)COMMIT獲得該錯(cuò)誤代碼時(shí),事務(wù)依然是活動(dòng)的,并且在COMMIT可以在當(dāng)前讀取的線程讀取結(jié)束后再次試圖讀取數(shù)據(jù)庫(kù)。

             

            END TRANSACTION

             

            sql-statement ::= BEGIN [ DEFERRED | IMMEDIATE | EXCLUSIVE ] [TRANSACTION [name]]
            sql-statement ::= END [TRANSACTION [name]]
            sql-statement ::= COMMIT [TRANSACTION [name]]
            sql-statement ::= ROLLBACK [TRANSACTION [name]]

             

            從2.0版開(kāi)始,SQLite支持帶有回退和原子性的提交的事務(wù)處理。

            可選的事務(wù)名稱會(huì)被忽略。SQLite目前不允許嵌套事務(wù)。

            在事務(wù)之外,不能對(duì)數(shù)據(jù)庫(kù)進(jìn)行更改。如果當(dāng)前沒(méi)有有效的事務(wù),任何修改數(shù)據(jù)庫(kù)的命令(基本上除了SELECT以外的所有SQL命令)會(huì)自動(dòng)啟動(dòng)一個(gè)事務(wù)。命令結(jié)束時(shí),自動(dòng)啟動(dòng)的事務(wù)會(huì)被提交。

            可以使用BEGIN命令手動(dòng)啟動(dòng)事務(wù)。這樣啟動(dòng)的事務(wù)會(huì)在下一條COMMIT或ROLLBACK命令之前一直有效。但若數(shù)據(jù)庫(kù)關(guān)閉或出現(xiàn)錯(cuò)誤且選用ROLLBACK沖突判定算法時(shí),數(shù)據(jù)庫(kù)也會(huì)ROLLBACK。查看ON CONFLICT子句獲取更多關(guān)于ROLLBACK沖突判定算法的信息。

            在SQLite 3.0.8或更高版本中,事務(wù)可以是延遲的,即時(shí)的或者獨(dú)占的。“延遲的”即是說(shuō)在數(shù)據(jù)庫(kù)第一次被訪問(wèn)之前不獲得鎖。這樣就會(huì)延遲事務(wù),BEGIN語(yǔ)句本身不做任何事情。直到初次讀取或訪問(wèn)數(shù)據(jù)庫(kù)時(shí)才獲取鎖。對(duì)數(shù)據(jù)庫(kù)的初次讀取創(chuàng)建一個(gè)SHARED鎖,初次寫(xiě)入創(chuàng)建一個(gè)RESERVED鎖。由于鎖的獲取被延遲到第一次需要時(shí),別的線程或進(jìn)程可以在當(dāng)前線程執(zhí)行BEGIN語(yǔ)句之后創(chuàng)建另外的事務(wù)寫(xiě)入數(shù)據(jù)庫(kù)。若事務(wù)是即時(shí)的,則執(zhí)行BEGIN命令后立即獲取RESERVED鎖,而不等數(shù)據(jù)庫(kù)被使用。在執(zhí)行BEGIN IMMEDIATE之后,你可以確保其它的線程或進(jìn)程不能寫(xiě)入數(shù)據(jù)庫(kù)或執(zhí)行BEGIN IMMEDIATE或BEGIN EXCLUSIVE,但其它進(jìn)程可以讀取數(shù)據(jù)庫(kù)。獨(dú)占事務(wù)在所有的數(shù)據(jù)庫(kù)獲取EXCLUSIVE鎖,在執(zhí)行BEGIN EXCLUSIVE之后,你可以確保在當(dāng)前事務(wù)結(jié)束前沒(méi)有任何其它線程或進(jìn)程能夠讀寫(xiě)數(shù)據(jù)庫(kù)。

            有關(guān)SHARED、RESERVED和EXCLUSIVE鎖可以參見(jiàn)這里。

            SQLite 3.0.8的默認(rèn)行為是創(chuàng)建延遲事務(wù)。SQLite 3.0.0到3.0.7中延遲事務(wù)是唯一可用的事務(wù)類型。SQLite 2.8或更早版本中,所有的事務(wù)都是獨(dú)占的。

            COMMIT命令在所有SQL命令完成之前并不作實(shí)際的提交工作。這樣若兩個(gè)或更多個(gè)SELECT語(yǔ)句在進(jìn)程中間而執(zhí)行COMMIT時(shí),只有全部SELECT語(yǔ)句結(jié)束才進(jìn)行提交。

            執(zhí)行COMMIT可能會(huì)返回SQLITE_BUSY錯(cuò)誤代碼。這就是說(shuō)有另外一個(gè)線程或進(jìn)程獲取了數(shù)據(jù)庫(kù)的讀取鎖,并阻止數(shù)據(jù)庫(kù)被改變。當(dāng)COMMIT獲得該錯(cuò)誤代碼時(shí),事務(wù)依然是活動(dòng)的,并且在COMMIT可以在當(dāng)前讀取的線程讀取結(jié)束后再次試圖讀取數(shù)據(jù)庫(kù)。

             

            注釋

             

            comment ::= SQL-comment | C-comment
            SQL-comment ::= -- single-line
            C-comment ::= /* multiple-lines [*/]

             

            注釋不是SQL命令,但會(huì)出現(xiàn)在SQL查詢中。它們被解釋器處理為空白部分。它們可以在任何空白可能存在的地方開(kāi)始 ,即使是在跨越多行的表達(dá)式中。

            SQL風(fēng)格的注釋僅對(duì)當(dāng)前行有效。

            C風(fēng)格的注釋可以跨越多行。若沒(méi)有結(jié)束符號(hào),注釋的范圍將一直延伸到輸入末尾,且不會(huì)引起報(bào)錯(cuò)。新的SQL語(yǔ)句可以從多行注釋結(jié)束的地方開(kāi)始。C風(fēng)格注釋可以嵌入任何空白可以出現(xiàn)的地方,包括表達(dá)式內(nèi),或其他SQL語(yǔ)句中間, 并且C風(fēng)格的注釋不互相嵌套。SQL風(fēng)格的注釋出現(xiàn)在C風(fēng)格注釋中時(shí)將被忽略。

             

            COPY

             

            sql-statement ::= COPY [ OR conflict-algorithm ] [database-name .] table-name FROM filename
            [ USING DELIMITERS delim ]

             

            COPY命令在SQLite 2.8及更早的版本中可用。SQLite 3.0刪除了這一命令,因?yàn)樵诨旌系腢TF-8/16環(huán)境中對(duì)它進(jìn)行支持是很復(fù)雜的。在3.0版本中,命令行解釋器包含新的.import命令,用以替代COPY。

            COPY命令是用于將大量數(shù)據(jù)插入表的一個(gè)插件。它模仿PostgreSQL中的相同命令而來(lái)。事實(shí)上,SQLite的COPY 命令就是為了能夠讀取PostgreSQL的備份工具pg_dump的輸出從而能夠?qū)ostgreSQL的數(shù)據(jù)輕松轉(zhuǎn)換到SQLite中而設(shè)計(jì)的。

            table-name是將要導(dǎo)入數(shù)據(jù)的一個(gè)已存在的表的名字。filename是一個(gè)字符串或標(biāo)識(shí)符,用于說(shuō)明作為數(shù)據(jù)來(lái)源的文件。filename可以使用STDIN從標(biāo)準(zhǔn)輸入流中獲取數(shù)據(jù)。

            輸入文件的每一行被轉(zhuǎn)換成一條單獨(dú)的記錄導(dǎo)入表中。字段用制表符分開(kāi)。若某個(gè)字段的數(shù)據(jù)中出現(xiàn)制表符,則前面被添加反斜線“/”符號(hào)。數(shù)據(jù)中的反斜線則被替換為兩條反斜線??蛇x的USING DELIMITERS子句可給出一個(gè)與制表符不同 的分界符。

            若字段由“/N”組成,則被賦以空值NULL。

            使用這一命令時(shí),利用可選的ON CONFLICT子句可以定義替代的約束沖突判定算法。更多信息,參見(jiàn) ON CONFLICT

            當(dāng)輸入數(shù)據(jù)源是STDIN,輸入將終止于一行僅包含一個(gè)反斜線和一個(gè)點(diǎn)的輸入:“/.”。

             

            CREATE INDEX

             

            sql-statement ::= CREATE [UNIQUE] INDEX [IF NOT EXISTS] [database-name .] index-name
            ON
            table-name ( column-name [, column-name]* )
            column-name ::= name [ COLLATE collation-name] [ ASC | DESC ]

             

            CREATE INDEX命令由“CREATE INDEX”關(guān)鍵字后跟新索引的名字,關(guān)鍵字“ON”,待索引表的名字,以及括弧內(nèi)的用于索引鍵的字段列表構(gòu)成。每個(gè)字段名可以跟隨“ASC”或“DESC”關(guān)鍵字說(shuō)明排序法則,但在當(dāng)前版本中排序法則被忽略。排序總是按照上升序。

            每個(gè)字段名后跟COLLATE子句定義文本記錄的比較順序。缺省的比較順序是由CREATE TABLE語(yǔ)句說(shuō)明的比較順序。若不定義比較順序,則使用內(nèi)建的二進(jìn)制比較順序。

            附加到單個(gè)表上的索引數(shù)目沒(méi)有限制,索引中的字段數(shù)也沒(méi)有限制。

            若UNIQUE關(guān)鍵字出現(xiàn)在CREATE和INDEX之間,則不允許重名的索引記錄。試圖插入重名記錄將會(huì)導(dǎo)致錯(cuò)誤。

            每條CREATE INDEX語(yǔ)句的文本儲(chǔ)存于sqlite_mastersqlite_temp_master表中,取決于被索引的表是否臨時(shí)表。 每次打開(kāi)數(shù)據(jù)庫(kù)時(shí),所有的CREATE INDEX語(yǔ)句從sqlite_master表中讀出,產(chǎn)生SQLite的索引樣式的內(nèi)部結(jié)構(gòu)。

            若使用可選的IF NOT EXISTS子句,且存在同名索引,則該命令無(wú)效。

            使用DROP INDEX命令刪除索引。

             

            CREATE TABLE

             

            sql-command ::= CREATE [TEMP | TEMPORARY] TABLE [IF NOT EXISTS] table-name (
                
            column-def [, column-def]*
                
            [, constraint]*
            )
            sql-command ::= CREATE [TEMP | TEMPORARY] TABLE [database-name.] table-name AS select-statement
            column-def ::= name [type] [[CONSTRAINT name] column-constraint]*
            type ::= typename |
            typename ( number ) |
            typename ( number , number )
            column-constraint ::= NOT NULL [ conflict-clause ] |
            PRIMARY KEY
            [sort-order] [ conflict-clause ] [AUTOINCREMENT] |
            UNIQUE
            [ conflict-clause ] |
            CHECK (
            expr ) |
            DEFAULT
            value |
            COLLATE
            collation-name
            constraint ::= PRIMARY KEY ( column-list ) [ conflict-clause ] |
            UNIQUE (
            column-list ) [ conflict-clause ] |
            CHECK (
            expr )
            conflict-clause ::= ON CONFLICT conflict-algorithm

             

            CREATE TABLE語(yǔ)句基本上就是“CREATE TABLE”關(guān)鍵字后跟一個(gè)新的表名以及括號(hào)內(nèi)的一堆定義和約束。表名可以是字符串或者標(biāo)識(shí)符。以“sqlite_”開(kāi)頭的表名是留給數(shù)據(jù)庫(kù)引擎使用的。

            每個(gè)字段的定義是字段名后跟字段的數(shù)據(jù)類型,接著是一個(gè)或多個(gè)的字段約束。字段的數(shù)據(jù)類型并不限制字段中可以存放的數(shù)據(jù)。可以查看SQLite3的數(shù)據(jù)類型獲取更多信息。UNIQUE約束為指定的字段創(chuàng)建索引,該索引須含有唯一鍵。COLLATE子句說(shuō)明在比較字段的 文字記錄時(shí)所使用的排序函數(shù)。缺省使用內(nèi)嵌的BINARY排序函數(shù)。

            DEFAULT約束說(shuō)明在使用INSERT插入字段時(shí)所使用的缺省值。該值可以是NULL,字符串常量或一個(gè)數(shù)。從3.1.0版開(kāi)始,缺省值也可以是以下特殊的與事件無(wú)關(guān)的關(guān)鍵字CURRENT_TIME、CURRENT_DATE或CURRENT_TIMESTAMP。若缺省值為NULL、字符串常量或數(shù),在執(zhí)行未指明字段值的INSERT語(yǔ)句的時(shí)候它被插入字段。若缺省值是CURRENT_TIME、CURRENT_DATE或CURRENT_TIMESTAMP,則當(dāng)前UTC日期和/或時(shí)間被插入字段。CURRENT_TIME的格式為“HH:MM:SS”,CURRENT_DATE為“YYYY-MM-DD”,而CURRENT_TIMESTAMP是“YYYY-MM-DD HH:MM:SS”。

            正常情況下定義PRIMARY KEY只是在相應(yīng)字段上創(chuàng)建一個(gè)UNIQUE索引。然而,若主鍵定義在單一的INTEGER類型的字段上,則該字段在內(nèi)部被用作表的B-Tree鍵。這即是說(shuō)字段僅能容納唯一整數(shù)值。(在除此之外的其它情況下,SQLite忽略數(shù)據(jù)類型的說(shuō)明 ,允許任何類型的數(shù)據(jù)放入字段中,不管該字段被聲明為什么數(shù)據(jù)類型。)若一個(gè)表中不含一個(gè)INTEGER PRIMARY KEY字段,則B-Tree鍵為自動(dòng)產(chǎn)生的整數(shù)。一行的B-Tree鍵可以通過(guò)如下特殊的名字“ROWID”、“OID”或“_ROWID_”進(jìn)行訪問(wèn),不論是否有INTEGER PRIMARY KEY存在。INTEGER PRIMARY KEY字段可以使用關(guān)鍵字AUTOINCREMENT聲明。AUTOINCREMENT關(guān)鍵字修改了B-Tree鍵自動(dòng)產(chǎn)生的方式。B-Tree鍵的生成的其它信息可以在這里找到。

            若“TEMP”或“TEMPORARY”關(guān)鍵字出現(xiàn)在“CREATE”和“TABLE”之間,則所建立的表僅在當(dāng)前數(shù)據(jù)庫(kù)連接可見(jiàn),并在斷開(kāi)連接時(shí)自動(dòng)被刪除。在臨時(shí)表上建立的任何索引也是臨時(shí)的。臨時(shí)表和索引單獨(dú)存儲(chǔ)在與主數(shù)據(jù)庫(kù)文件不同的文件中。

            若說(shuō)明了,則表在該數(shù)據(jù)庫(kù)中被創(chuàng)建。同時(shí)聲明和TEMP關(guān)鍵字會(huì)出錯(cuò),除非 是“temp”。若不聲明數(shù)據(jù)庫(kù)名,也不使用TEMP關(guān)鍵字,則表創(chuàng)建于主數(shù)據(jù)庫(kù)中。

            在每個(gè)約束后跟可選的ON CONFLICT子句可以定義替代的約束沖突判定算法。 缺省為ABORT。同一個(gè)表中的不同約束可以使用不同的缺省沖突判定算法。若一條COPY、INSERT或UPDATE命令指定了不同的沖突判定算法,則該算法將替代CREATE TABLE語(yǔ)句中說(shuō)明的缺省算法。更多信息,參見(jiàn)ON CONFLICT。

            3.3.0版支持CHECK約束。在3.3.0之前,CHECK約束被解析但不執(zhí)行。

            表中的字段數(shù)或約束數(shù)沒(méi)有任何限制。在2.8版中,單行數(shù)據(jù)的總數(shù)被限制為小于1 megabytes。而在3.0中則消除了限制。

            CREATE TABLE AS形式定義表為一個(gè)查詢的結(jié)果集。表的字段名字即是結(jié)果中的字段名字。

            每條CREATE TABLE語(yǔ)句的文本都儲(chǔ)存在sqlite_master表中。每當(dāng)數(shù)據(jù)庫(kù)被打開(kāi),所有的CREATE TABLE語(yǔ)句從 sqlite_master表中讀出,構(gòu)成表結(jié)構(gòu)的SQLite內(nèi)部實(shí)現(xiàn)。若原始命令為CREATE TABLE AS則合成出等效的CREATE TABLE語(yǔ)句并儲(chǔ)存于sqlite_master表中代替原命令。CREATE TEMPORARY TABLE語(yǔ)句文本儲(chǔ)存于sqlite_temp_master表中。

            若在命令中使用可選的IF NOT EXISTS子句且存在同名的另一個(gè)表,則當(dāng)前的命令無(wú)效。

            刪除表可以使用DROP TABLE語(yǔ)句。

             

             

            CREATE TRIGGER

             

            sql-statement ::= CREATE [TEMP | TEMPORARY] TRIGGER trigger-name [ BEFORE | AFTER ]
            database-event ON [database-name .] table-name
            trigger-action
            sql-statement ::= CREATE [TEMP | TEMPORARY] TRIGGER trigger-name INSTEAD OF
            database-event ON [database-name .] view-name
            trigger-action
            database-event ::= DELETE |
            INSERT
            |
            UPDATE
            |
            UPDATE OF
            column-list
            trigger-action ::= [ FOR EACH ROW | FOR EACH STATEMENT ] [ WHEN expression ]
            BEGIN
                
            trigger-step ; [ trigger-step ; ]*
            END
            trigger-step ::= update-statement | insert-statement |
            delete-statement | select-statement

             

            CREATE TRIGGER語(yǔ)句用于向數(shù)據(jù)庫(kù)schema中添加觸發(fā)器。觸發(fā)器是一些在特定的數(shù)據(jù)庫(kù)事件(database-event)發(fā)生時(shí)自動(dòng)進(jìn)行的數(shù)據(jù)庫(kù)操作(trigger-action)。

            觸發(fā)器可由在特殊表上執(zhí)行的DELETE、INSERT、UPDATE等語(yǔ)句觸發(fā),或UPDATE表中特定的字段時(shí)觸發(fā)。

            現(xiàn)在SQLite僅支持FOR EACH ROW觸發(fā)器,不支持FOR EACH STATEMENT觸發(fā)。因此可以不用明確說(shuō)明FOR EACH ROW。FOR EACH ROW的意思是由trigger-steps說(shuō)明的SQL語(yǔ)句可能在(由WHEN子句決定的)數(shù)據(jù)庫(kù)插入,更改或刪除的每一行觸發(fā)trigger。

            WHEN子句和trigger-steps可以使用“NEW.column-name”和“OLD.column-name”的引用形式訪問(wèn)正在被插入,更改或刪除的行的元素,column-name是觸發(fā)器關(guān)聯(lián)的表中的字段名。OLD和NEW引用只在觸發(fā)器與之相關(guān)的trigger-event處可用,例如:

             

            INSERT NEW可用
            UPDATE NEW和OLD均可用
            DELETE OLD可用

             

            當(dāng)使用WHEN子句,trigger-steps只在WHEN子句為真的行執(zhí)行。不使用WHEN時(shí)則在所有行執(zhí)行。

            trigger-time決定了trigger-steps執(zhí)行的時(shí)間,它是相對(duì)于關(guān)聯(lián)行的插入、刪除和修改而言的。

            作為的一部分trigger-step的UPDATE或INSERT可以使用ON CONFLICT子句。但若觸發(fā)trigger的語(yǔ)句使用了ON CONFLICT子句,則覆蓋前述的ON CONFLICT子句所定義的沖突處理方法。

            關(guān)聯(lián)表被撤銷時(shí)觸發(fā)器被自動(dòng)刪除。

            不僅在表上,在視圖上一樣可以創(chuàng)建觸發(fā)器,在CREATE TRIGGER語(yǔ)句中使用INSTEAD OF即可。若視圖上定義了一個(gè)或多個(gè)ON INSERT、ON DELETE、ON UPDATE觸發(fā)器,則相應(yīng)地對(duì)視圖執(zhí)行INSERT、DELETE或UPDATE語(yǔ)句不會(huì)出錯(cuò),而會(huì)觸發(fā)關(guān)聯(lián)的觸發(fā)器。視圖關(guān)聯(lián)的表不會(huì)被修改。(除了由觸發(fā)器進(jìn)行的修改操作)。

            例子:

            假設(shè)“customers”表存儲(chǔ)了客戶信息,“orders”表存儲(chǔ)了訂單信息,下面的觸發(fā)器確保當(dāng)用戶改變地址時(shí)所有的關(guān)聯(lián)訂單地址均進(jìn)行相應(yīng)改變:

             
            CREATE TRIGGER update_customer_address UPDATE OF address ON customers    
                BEGIN 
                  UPDATE orders SET address = new.address WHERE customer_name = old.name; 
                END; 
            

            定義了該觸發(fā)器后執(zhí)行如下語(yǔ)句:

             
            UPDATE customers SET address = ’1 Main St.’ WHERE name = ’Jack Jones’; 
            

            會(huì)使下面的語(yǔ)句自動(dòng)執(zhí)行:

             
            UPDATE orders SET address = ’1 Main St.’ WHERE customer_name = ’Jack Jones’; 
            

            注意,目前在有INTEGER PRIMARY KEY域的表上觸發(fā)器可能工作不正常。若BEFORE觸發(fā)器修改了一行的INTEGER PRIMARY KEY域,而該域?qū)⒂捎|發(fā)該觸發(fā)器的語(yǔ)句進(jìn)行修改,則可能根本不會(huì)修改該域??梢杂肞RIMARY KEY字段代替INTEGER PRIMARY KEY字段來(lái)解決上述問(wèn)題。

            一個(gè)特殊的SQL函數(shù)RAISE()可用于觸發(fā)器程序,使用如下語(yǔ)法:

             

            raise-function ::= RAISE ( ABORT, error-message ) |
            RAISE ( FAIL,
            error-message ) |
            RAISE ( ROLLBACK,
            error-message ) |
            RAISE ( IGNORE )

             

            當(dāng)觸發(fā)器程序執(zhí)行中調(diào)用了上述前三個(gè)之一的形式時(shí),則執(zhí)行指定的ON CONFLICT進(jìn)程(ABORT、FAIL或者ROLLBACK)且終止當(dāng)前查詢,返回一個(gè)SQLITE_CONSTRAINT錯(cuò)誤并說(shuō)明錯(cuò)誤信息。

            當(dāng)調(diào)用RAISE(IGNORE),當(dāng)前觸發(fā)器程序的余下部分,觸發(fā)該觸發(fā)器的語(yǔ)句和任何之后的觸發(fā)器程序被忽略并且不恢復(fù)對(duì)數(shù)據(jù)庫(kù)的已有改變。若觸發(fā)觸發(fā)器的語(yǔ)句是一個(gè)觸發(fā)器程序本身的一部分,則原觸發(fā)器程序從下一步起繼續(xù)執(zhí)行。

            使用DROP TRIGGER刪除觸發(fā)器。

             

            CREATE VIEW

             

            sql-command ::= CREATE [TEMP | TEMPORARY] VIEW [database-name.] view-name AS select-statement

             

            CREATE VIEW命令為一個(gè)包裝好的SELECT語(yǔ)句命名。當(dāng)創(chuàng)建了一個(gè)視圖,它可以用于其他SELECT的FROM字句中代替表名。

            若“TEMP”或“TEMPORARY”關(guān)鍵字出現(xiàn)在“CREATE”和“VIEW”之間,則創(chuàng)建的視圖僅對(duì)打開(kāi)數(shù)據(jù)庫(kù)的進(jìn)程可見(jiàn),且在數(shù)據(jù)庫(kù)關(guān)閉時(shí)自動(dòng)刪除。

            若指定了則視圖在指定的數(shù)據(jù)庫(kù)中創(chuàng)建。同時(shí)使用和TEMP關(guān)鍵字會(huì)導(dǎo)致錯(cuò)誤,除非是“temp”。若不聲明數(shù)據(jù)庫(kù)名,也不使用TEMP關(guān)鍵字,則視圖創(chuàng)建于主數(shù)據(jù)庫(kù)中。

            你不能對(duì)視圖使用COPY、DELETE、INSERT或UPDATE,視圖在SQLite中是只讀的。多數(shù)情況下你可以在視圖上創(chuàng)建TRIGGER來(lái)達(dá)到相同目的。用DROP VIEW命令來(lái)刪除視圖。

             

            DELETE

             

            sql-statement ::= DELETE FROM [database-name .] table-name [WHERE expr]

             

            DELETE命令用于從表中刪除記錄。命令包含“DELETE FROM”關(guān)鍵字以及需要?jiǎng)h除的記錄所在的表名。

            若不使用WHERE子句,表中的所有行將全部被刪除。否則僅刪除符合條件的行。

             

            DETACH DATABASE

             

            sql-command ::= DETACH [DATABASE] database-name

             

            該語(yǔ)句拆分一個(gè)之前使用ATTACH DATABASE語(yǔ)句附加的數(shù)據(jù)庫(kù)連接??梢允褂貌煌拿侄啻胃郊油粩?shù)據(jù)庫(kù),并且拆分一個(gè)連接不會(huì)影響其他連接。

            若SQLite在事務(wù)進(jìn)行中,該語(yǔ)句不起作用。

             

            DROP INDEX

             

            sql-command ::= DROP INDEX [IF EXISTS] [database-name .] index-name

             

            DROP INDEX語(yǔ)句刪除由CREATE INDEX語(yǔ)句創(chuàng)建的索引。索引將從數(shù)據(jù)庫(kù)結(jié)構(gòu)和磁盤(pán)文件中完全刪除,唯一的恢復(fù)方法是重新輸入相應(yīng)的CREATE INDEX命令。

            DROP TABLE語(yǔ)句在缺省模式下不減小數(shù)據(jù)庫(kù)文件的大小??臻g會(huì)留給后來(lái)的INSERT語(yǔ)句使用。要釋放刪除產(chǎn)生的空間,可以使用VACUUM命令。若AUTOVACUUM模式開(kāi)啟,則空間會(huì)自動(dòng)被DROP INDEX釋放。

             

            DROP TABLE

             

            sql-command ::= DROP TABLE [IF EXISTS] [database-name.] table-name

             

            DROP TABLE語(yǔ)句刪除由CREATE TABLE語(yǔ)句創(chuàng)建的表。表將從數(shù)據(jù)庫(kù)結(jié)構(gòu)和磁盤(pán)文件中完全刪除,且不能恢復(fù)。該表的所有索引也同時(shí)被刪除。

            DROP TABLE語(yǔ)句在缺省模式下不減小數(shù)據(jù)庫(kù)文件的大小??臻g會(huì)留給后來(lái)的INSERT語(yǔ)句使用。要釋放刪除產(chǎn)生的空間,可以使用VACUUM命令。若AUTOVACUUM模式開(kāi)啟,則空間會(huì)自動(dòng)被DROP TABLE釋放。

            若使用可選的IF EXISTS子句,在刪除的表不存在時(shí)就不會(huì)報(bào)錯(cuò)。

             

            DROP TRIGGER

             

            sql-statement ::= DROP TRIGGER [database-name .] trigger-name

             

            DROP TRIGGER語(yǔ)句刪除由CREATE TRIGGER創(chuàng)建的觸發(fā)器。觸發(fā)器從數(shù)據(jù)庫(kù)的schema中刪除。注意當(dāng)關(guān)聯(lián)的表被撤消時(shí)觸發(fā)器自動(dòng)被刪除。

             

            DROP VIEW

             

            sql-command ::= DROP VIEW view-name

             

            DROP VIEW語(yǔ)句刪除由CREATE VIEW創(chuàng)建的視圖。視圖從數(shù)據(jù)庫(kù)的schema中刪除,表中的數(shù)據(jù)不會(huì)被更改。

             

            EXPLAIN

             

            sql-statement ::= EXPLAIN sql-statement

             

            EXPLAIN命令修飾語(yǔ)是一個(gè)非標(biāo)準(zhǔn)的擴(kuò)展功能,靈感來(lái)自PostgreSQL中的相同命令,但操作完全不同。

            若EXPLAIN關(guān)鍵字出現(xiàn)在任何SQLite的SQL命令之前,則SQLite庫(kù)返回不加EXPLAIN時(shí)執(zhí)行該命令所需要使用的虛擬機(jī)指令序列,而不是真正執(zhí)行該命令。關(guān)于虛擬機(jī)指令的更多信息參見(jiàn)系統(tǒng)結(jié)構(gòu)描述或關(guān)于虛擬機(jī)的可用代碼。

             

            表達(dá)式

             

              <cite id="wmwkq"></cite>
                • <table id="wmwkq"></table>
                  <rt id="wmwkq"><tr id="wmwkq"></tr></rt>
                  expr ::= expr binary-op expr |
                  expr [NOT] like-op expr [ESCAPE expr] |
                  unary-op #
                  posted on 2012-08-10 13:23 王海光 閱讀(1017) 評(píng)論(0)  編輯 收藏 引用 所屬分類: SQLite
                  久久久久免费精品国产| 免费久久人人爽人人爽av| 精品国际久久久久999波多野| 久久精品毛片免费观看| 国产一级做a爰片久久毛片| 久久亚洲视频| 五月丁香综合激情六月久久| 久久精品国产第一区二区三区 | 麻豆久久久9性大片| 久久精品中文无码资源站| 久久综合狠狠综合久久97色| 久久夜色精品国产噜噜噜亚洲AV| www亚洲欲色成人久久精品| 综合人妻久久一区二区精品| 精品久久久久久久久久中文字幕| 亚洲第一极品精品无码久久| 久久精品国产福利国产琪琪| 99精品国产在热久久无毒不卡| 久久亚洲精品无码观看不卡| 日本免费一区二区久久人人澡| 伊人久久大香线蕉av一区| 三级片免费观看久久| 伊人久久大香线焦综合四虎| 国内精品人妻无码久久久影院 | 97精品国产91久久久久久| 一本一本久久A久久综合精品 | 亚洲AV乱码久久精品蜜桃| 久久久99精品成人片中文字幕| 99国产精品久久久久久久成人热| 亚洲狠狠婷婷综合久久久久| 亚洲国产日韩欧美综合久久| 久久综合给合综合久久| 久久久久99精品成人片| 久久精品无码一区二区三区免费| 大美女久久久久久j久久| 亚洲国产成人久久精品影视| 久久99精品综合国产首页| 亚洲一区中文字幕久久| 国产精品熟女福利久久AV| 久久久久无码精品国产app| 久久久久亚洲精品男人的天堂|