• <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>
            面對現實,超越自己
            逆水行舟,不進則退
            posts - 269,comments - 32,trackbacks - 0

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

            如下語法表格中,純文本用藍色粗體顯示。非終極符號為斜體紅色。作為語法一部分的運算符用黑色Roman字體表示。

            這篇文檔只是對SQLite實現的SQL語法的綜述,有所忽略。想要得到更詳細的信息,參考源代碼和語法文件“parse.y”。

            SQLite執行如下的語法:

            • 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
            • 表達式
            • 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語法用于重命名表名[database-name.]table-namenew-table-name。這一命令不能用于在附加數據庫之間移動表,只能在同一個數據庫中對表進行重命名。

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

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

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

            ALTER TABLE語句的執行時間與表中的數據量無關,它在操作一個有一千萬行的表時的運行時間與操作僅有一行的表時是一樣的。

            在對數據庫運行ADD COLUMN之后,該數據庫將無法由SQLite 3.1.3及更早版本讀取,除非運行VACUUM命令。

             

            ANALYZE

             

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

             

            ANALYZE命令令集合關于索引的統計信息并將它們儲存在數據庫的一個特殊表中,查詢優化器可以用該表來制作更好的索引選擇。若不給出參數,所有附加數據庫中的所有索引被分析。若參數給出數據庫名,該數據庫中的所有索引被分析。若給出表名 作參數,則只有關聯該表的索引被分析。

            最初的實現將所有的統計信息儲存在一個名叫sqlite_stat1的表中。未來的加強版本中可能會創建名字類似的其它表,只是把“1”改為其它數字。sqlite_stat1表不能夠被撤銷,但其中的所有內容可以被刪除,這是與撤銷該表等效的行為。

             

            ATTACH DATABASE

            ATTACH DATABASE語句將一個已存在的數據庫添加到當前數據庫連接。若文件名含標點符號,則應用引號引起來。數據庫名’main’和’temp’代表主數據庫和用于存放臨時表的數據庫,它們不能被拆分。拆分數據庫使用DETACH DATABASE語句。

            你可以讀寫附加數據庫,或改變其結構。這是SQLite 3.0提供的新特性。在SQLite 2.8中,改變附加數據庫的結構是不允許的。

            在附加數據庫中添加一個與已有表同名的表是不允許的。但你可以附加帶有與主數據庫中的表同名的表的數據庫。也可以多次附加同一數據庫。

            使用database-name.table-name來引用附加數據庫中的表。若附加數據庫中的表與主數據庫的表不重名,則不需加數據庫名作為前綴。當數據庫被附加時,它的所有不重名的表成為該名字指向的缺省表。之后附加的任意與之同名的表需要加前綴。若“缺省”表被拆分,則最后附加的同名表變為“缺省”表。

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

            對附加數據庫的數目有編譯時的限制,最多10個附加數據庫。

             

            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版開始,SQLite支持帶有回退和原子性的提交的事務處理。

            可選的事務名稱會被忽略。SQLite目前不允許嵌套事務。

            在事務之外,不能對數據庫進行更改。如果當前沒有有效的事務,任何修改數據庫的命令(基本上除了SELECT以外的所有SQL命令)會自動啟動一個事務。命令結束時,自動啟動的事務會被提交。

            可以使用BEGIN命令手動啟動事務。這樣啟動的事務會在下一條COMMIT或ROLLBACK命令之前一直有效。但若數據庫關閉或出現錯誤且選用ROLLBACK沖突判定算法時,數據庫也會ROLLBACK。查看ON CONFLICT子句獲取更多關于ROLLBACK沖突判定算法的信息。

            在SQLite 3.0.8或更高版本中,事務可以是延遲的,即時的或者獨占的。“延遲的”即是說在數據庫第一次被訪問之前不獲得鎖。這樣就會延遲事務,BEGIN語句本身不做任何事情。直到初次讀取或訪問數據庫時才獲取鎖。對數據庫的初次讀取創建一個SHARED鎖 ,初次寫入創建一個RESERVED鎖。由于鎖的獲取被延遲到第一次需要時,別的線程或進程可以在當前線程執行BEGIN語句之后創建另外的事務 寫入數據庫。若事務是即時的,則執行BEGIN命令后立即獲取RESERVED鎖,而不等數據庫被使用。在執行BEGIN IMMEDIATE之后,你可以確保其它的線程或進程不能寫入數據庫或執行BEGIN IMMEDIATE或BEGIN EXCLUSIVE,但其它進程可以讀取數據庫。獨占事務在所有的數據庫獲取EXCLUSIVE鎖,在執行BEGIN EXCLUSIVE之后,你可以確保在當前事務結束前沒有任何其它線程或進程 能夠讀寫數據庫。

            有關SHARED、RESERVED和EXCLUSIVE鎖可以參見這里

            SQLite 3.0.8的默認行為是創建延遲事務。SQLite 3.0.0到3.0.7中延遲事務是唯一可用的事務類型。SQLite 2.8或更早版本中,所有的事務都是獨占的。

            COMMIT命令在所有SQL命令完成之前并不作實際的提交工作。這樣若兩個或更多個SELECT語句在進程中間而執行COMMIT時,只有全部SELECT語句結束才進行提交。

            執行COMMIT可能會返回SQLITE_BUSY錯誤代碼。這就是說有另外一個線程或進程獲取了數據庫的讀取鎖,并阻止數據庫被改變。當COMMIT獲得該錯誤代碼時,事務依然是活動的,并且在COMMIT可以在當前讀取的線程讀取結束后再次試圖讀取數據庫。

             

            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版開始,SQLite支持帶有回退和原子性的提交的事務處理。

            可選的事務名稱會被忽略。SQLite目前不允許嵌套事務。

            在事務之外,不能對數據庫進行更改。如果當前沒有有效的事務,任何修改數據庫的命令(基本上除了SELECT以外的所有SQL命令)會自動啟動一個事務。命令結束時,自動啟動的事務會被提交。

            可以使用BEGIN命令手動啟動事務。這樣啟動的事務會在下一條COMMIT或ROLLBACK命令之前一直有效。但若數據庫關閉或出現錯誤且選用ROLLBACK沖突判定算法時,數據庫也會ROLLBACK。查看ON CONFLICT子句獲取更多關于ROLLBACK沖突判定算法的信息。

            在SQLite 3.0.8或更高版本中,事務可以是延遲的,即時的或者獨占的。“延遲的”即是說在數據庫第一次被訪問之前不獲得鎖。這樣就會延遲事務,BEGIN語句本身不做任何事情。直到初次讀取或訪問數據庫時才獲取鎖。對數據庫的初次讀取創建一個SHARED鎖,初次寫入創建一個RESERVED鎖。由于鎖的獲取被延遲到第一次需要時,別的線程或進程可以在當前線程執行BEGIN語句之后創建另外的事務寫入數據庫。若事務是即時的,則執行BEGIN命令后立即獲取RESERVED鎖,而不等數據庫被使用。在執行BEGIN IMMEDIATE之后,你可以確保其它的線程或進程不能寫入數據庫或執行BEGIN IMMEDIATE或BEGIN EXCLUSIVE,但其它進程可以讀取數據庫。獨占事務在所有的數據庫獲取EXCLUSIVE鎖,在執行BEGIN EXCLUSIVE之后,你可以確保在當前事務結束前沒有任何其它線程或進程能夠讀寫數據庫。

            有關SHARED、RESERVED和EXCLUSIVE鎖可以參見這里。

            SQLite 3.0.8的默認行為是創建延遲事務。SQLite 3.0.0到3.0.7中延遲事務是唯一可用的事務類型。SQLite 2.8或更早版本中,所有的事務都是獨占的。

            COMMIT命令在所有SQL命令完成之前并不作實際的提交工作。這樣若兩個或更多個SELECT語句在進程中間而執行COMMIT時,只有全部SELECT語句結束才進行提交。

            執行COMMIT可能會返回SQLITE_BUSY錯誤代碼。這就是說有另外一個線程或進程獲取了數據庫的讀取鎖,并阻止數據庫被改變。當COMMIT獲得該錯誤代碼時,事務依然是活動的,并且在COMMIT可以在當前讀取的線程讀取結束后再次試圖讀取數據庫。

             

            注釋

             

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

             

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

            SQL風格的注釋僅對當前行有效。

            C風格的注釋可以跨越多行。若沒有結束符號,注釋的范圍將一直延伸到輸入末尾,且不會引起報錯。新的SQL語句可以從多行注釋結束的地方開始。C風格注釋可以嵌入任何空白可以出現的地方,包括表達式內,或其他SQL語句中間, 并且C風格的注釋不互相嵌套。SQL風格的注釋出現在C風格注釋中時將被忽略。

             

            COPY

             

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

             

            COPY命令在SQLite 2.8及更早的版本中可用。SQLite 3.0刪除了這一命令,因為在混合的UTF-8/16環境中對它進行支持是很復雜的。在3.0版本中,命令行解釋器包含新的.import命令,用以替代COPY。

            COPY命令是用于將大量數據插入表的一個插件。它模仿PostgreSQL中的相同命令而來。事實上,SQLite的COPY 命令就是為了能夠讀取PostgreSQL的備份工具pg_dump的輸出從而能夠將PostgreSQL的數據輕松轉換到SQLite中而設計的。

            table-name是將要導入數據的一個已存在的表的名字。filename是一個字符串或標識符,用于說明作為數據來源的文件。filename可以使用STDIN從標準輸入流中獲取數據。

            輸入文件的每一行被轉換成一條單獨的記錄導入表中。字段用制表符分開。若某個字段的數據中出現制表符,則前面被添加反斜線“/”符號。數據中的反斜線則被替換為兩條反斜線。可選的USING DELIMITERS子句可給出一個與制表符不同 的分界符。

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

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

            當輸入數據源是STDIN,輸入將終止于一行僅包含一個反斜線和一個點的輸入:“/.”。

             

            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”關鍵字后跟新索引的名字,關鍵字“ON”,待索引表的名字,以及括弧內的用于索引鍵的字段列表構成。每個字段名可以跟隨“ASC”或“DESC”關鍵字說明排序法則,但在當前版本中排序法則被忽略。排序總是按照上升序。

            每個字段名后跟COLLATE子句定義文本記錄的比較順序。缺省的比較順序是由CREATE TABLE語句說明的比較順序。若不定義比較順序,則使用內建的二進制比較順序。

            附加到單個表上的索引數目沒有限制,索引中的字段數也沒有限制。

            若UNIQUE關鍵字出現在CREATE和INDEX之間,則不允許重名的索引記錄。試圖插入重名記錄將會導致錯誤。

            每條CREATE INDEX語句的文本儲存于sqlite_mastersqlite_temp_master表中,取決于被索引的表是否臨時表。 每次打開數據庫時,所有的CREATE INDEX語句從sqlite_master表中讀出,產生SQLite的索引樣式的內部結構。

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

            使用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語句基本上就是“CREATE TABLE”關鍵字后跟一個新的表名以及括號內的一堆定義和約束。表名可以是字符串或者標識符。以“sqlite_”開頭的表名是留給數據庫引擎使用的。

            每個字段的定義是字段名后跟字段的數據類型,接著是一個或多個的字段約束。字段的數據類型并不限制字段中可以存放的數據??梢圆榭?span style="color: #ff3434">SQLite3的數據類型獲取更多信息。UNIQUE約束為指定的字段創建索引,該索引須含有唯一鍵。COLLATE子句說明在比較字段的 文字記錄時所使用的排序函數。缺省使用內嵌的BINARY排序函數。

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

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

            若“TEMP”或“TEMPORARY”關鍵字出現在“CREATE”和“TABLE”之間,則所建立的表僅在當前數據庫連接可見,并在斷開連接時自動被刪除。在臨時表上建立的任何索引也是臨時的。臨時表和索引單獨存儲在與主數據庫文件不同的文件中。

            若說明了,則表在該數據庫中被創建。同時聲明和TEMP關鍵字會出錯,除非 是“temp”。若不聲明數據庫名,也不使用TEMP關鍵字,則表創建于主數據庫中。

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

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

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

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

            每條CREATE TABLE語句的文本都儲存在sqlite_master表中。每當數據庫被打開,所有的CREATE TABLE語句從 sqlite_master表中讀出,構成表結構的SQLite內部實現。若原始命令為CREATE TABLE AS則合成出等效的CREATE TABLE語句并儲存于sqlite_master表中代替原命令。CREATE TEMPORARY TABLE語句文本儲存于sqlite_temp_master表中。

            若在命令中使用可選的IF NOT EXISTS子句且存在同名的另一個表,則當前的命令無效。

            刪除表可以使用DROP TABLE語句。

             

             

            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語句用于向數據庫schema中添加觸發器。觸發器是一些在特定的數據庫事件(database-event)發生時自動進行的數據庫操作(trigger-action)。

            觸發器可由在特殊表上執行的DELETE、INSERT、UPDATE等語句觸發,或UPDATE表中特定的字段時觸發。

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

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

             

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

             

            當使用WHEN子句,trigger-steps只在WHEN子句為真的行執行。不使用WHEN時則在所有行執行。

            trigger-time決定了trigger-steps執行的時間,它是相對于關聯行的插入、刪除和修改而言的。

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

            關聯表被撤銷時觸發器被自動刪除。

            不僅在表上,在視圖上一樣可以創建觸發器,在CREATE TRIGGER語句中使用INSTEAD OF即可。若視圖上定義了一個或多個ON INSERT、ON DELETE、ON UPDATE觸發器,則相應地對視圖執行INSERT、DELETE或UPDATE語句不會出錯,而會觸發關聯的觸發器。視圖關聯的表不會被修改。(除了由觸發器進行的修改操作)。

            例子:

            假設“customers”表存儲了客戶信息,“orders”表存儲了訂單信息,下面的觸發器確保當用戶改變地址時所有的關聯訂單地址均進行相應改變:

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

            定義了該觸發器后執行如下語句:

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

            會使下面的語句自動執行:

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

            注意,目前在有INTEGER PRIMARY KEY域的表上觸發器可能工作不正常。若BEFORE觸發器修改了一行的INTEGER PRIMARY KEY域,而該域將由觸發該觸發器的語句進行修改,則可能根本不會修改該域。可以用PRIMARY KEY字段代替INTEGER PRIMARY KEY字段來解決上述問題。

            一個特殊的SQL函數RAISE()可用于觸發器程序,使用如下語法:

             

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

             

            當觸發器程序執行中調用了上述前三個之一的形式時,則執行指定的ON CONFLICT進程(ABORT、FAIL或者ROLLBACK)且終止當前查詢,返回一個SQLITE_CONSTRAINT錯誤并說明錯誤信息。

            當調用RAISE(IGNORE),當前觸發器程序的余下部分,觸發該觸發器的語句和任何之后的觸發器程序被忽略并且不恢復對數據庫的已有改變。若觸發觸發器的語句是一個觸發器程序本身的一部分,則原觸發器程序從下一步起繼續執行。

            使用DROP TRIGGER刪除觸發器。

             

            CREATE VIEW

             

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

             

            CREATE VIEW命令為一個包裝好的SELECT語句命名。當創建了一個視圖,它可以用于其他SELECT的FROM字句中代替表名。

            若“TEMP”或“TEMPORARY”關鍵字出現在“CREATE”和“VIEW”之間,則創建的視圖僅對打開數據庫的進程可見,且在數據庫關閉時自動刪除。

            若指定了則視圖在指定的數據庫中創建。同時使用和TEMP關鍵字會導致錯誤,除非是“temp”。若不聲明數據庫名,也不使用TEMP關鍵字,則視圖創建于主數據庫中。

            你不能對視圖使用COPY、DELETE、INSERT或UPDATE,視圖在SQLite中是只讀的。多數情況下你可以在視圖上創建TRIGGER來達到相同目的。用DROP VIEW命令來刪除視圖。

             

            DELETE

             

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

             

            DELETE命令用于從表中刪除記錄。命令包含“DELETE FROM”關鍵字以及需要刪除的記錄所在的表名。

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

             

            DETACH DATABASE

             

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

             

            該語句拆分一個之前使用ATTACH DATABASE語句附加的數據庫連接。可以使用不同的名字多次附加同一數據庫,并且拆分一個連接不會影響其他連接。

            若SQLite在事務進行中,該語句不起作用。

             

            DROP INDEX

             

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

             

            DROP INDEX語句刪除由CREATE INDEX語句創建的索引。索引將從數據庫結構和磁盤文件中完全刪除,唯一的恢復方法是重新輸入相應的CREATE INDEX命令。

            DROP TABLE語句在缺省模式下不減小數據庫文件的大小??臻g會留給后來的INSERT語句使用。要釋放刪除產生的空間,可以使用VACUUM命令。若AUTOVACUUM模式開啟,則空間會自動被DROP INDEX釋放。

             

            DROP TABLE

             

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

             

            DROP TABLE語句刪除由CREATE TABLE語句創建的表。表將從數據庫結構和磁盤文件中完全刪除,且不能恢復。該表的所有索引也同時被刪除。

            DROP TABLE語句在缺省模式下不減小數據庫文件的大小??臻g會留給后來的INSERT語句使用。要釋放刪除產生的空間,可以使用VACUUM命令。若AUTOVACUUM模式開啟,則空間會自動被DROP TABLE釋放。

            若使用可選的IF EXISTS子句,在刪除的表不存在時就不會報錯。

             

            DROP TRIGGER

             

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

             

            DROP TRIGGER語句刪除由CREATE TRIGGER創建的觸發器。觸發器從數據庫的schema中刪除。注意當關聯的表被撤消時觸發器自動被刪除。

             

            DROP VIEW

             

            sql-command ::= DROP VIEW view-name

             

            DROP VIEW語句刪除由CREATE VIEW創建的視圖。視圖從數據庫的schema中刪除,表中的數據不會被更改。

             

            EXPLAIN

             

            sql-statement ::= EXPLAIN sql-statement

             

            EXPLAIN命令修飾語是一個非標準的擴展功能,靈感來自PostgreSQL中的相同命令,但操作完全不同。

            若EXPLAIN關鍵字出現在任何SQLite的SQL命令之前,則SQLite庫返回不加EXPLAIN時執行該命令所需要使用的虛擬機指令序列,而不是真正執行該命令。關于虛擬機指令的更多信息參見系統結構描述或關于虛擬機的可用代碼。

             

            表達式

             

          1. <nav id="4y8gk"><dl id="4y8gk"></dl></nav>
            expr ::= expr binary-op expr |
            expr [NOT] like-op expr [ESCAPE expr] |
            unary-op #
            posted on 2012-08-10 13:23 王海光 閱讀(1007) 評論(0)  編輯 收藏 引用 所屬分類: SQLite
            国产99精品久久| 久久精品国产亚洲av麻豆蜜芽| 久久精品99久久香蕉国产色戒| 久久精品aⅴ无码中文字字幕重口| 久久香蕉国产线看观看乱码| 久久精品视频91| 久久精品无码专区免费青青| 久久91精品综合国产首页| 久久精品免费全国观看国产| 久久精品欧美日韩精品| 久久久久亚洲AV综合波多野结衣| 欧美牲交A欧牲交aⅴ久久| 国产高清美女一级a毛片久久w| 久久只这里是精品66| 91精品国产91热久久久久福利| 无码人妻精品一区二区三区久久久| 51久久夜色精品国产| 亚洲精品高清国产一线久久| 欧美激情精品久久久久久久| 狠狠88综合久久久久综合网| 久久久亚洲裙底偷窥综合| 久久国产香蕉视频| 久久精品国产影库免费看| 国产成年无码久久久免费| 亚洲精品成人久久久| 国产成人精品久久亚洲高清不卡 | 国内精品久久久久影院薰衣草| 热久久国产精品| 精品午夜久久福利大片| 久久精品无码午夜福利理论片 | 久久久久久A亚洲欧洲AV冫| 91精品国产综合久久婷婷| 亚洲av日韩精品久久久久久a | 青青青青久久精品国产| 久久精品国产亚洲AV电影| 欧美黑人激情性久久| 日本久久久久亚洲中字幕| 午夜人妻久久久久久久久| 亚洲精品乱码久久久久久自慰| 久久久亚洲欧洲日产国码二区| 久久久久久无码Av成人影院|
          2. <button id="4y8gk"><input id="4y8gk"></input></button>
            <li id="4y8gk"></li>
                  <rt id="4y8gk"><acronym id="4y8gk"></acronym></rt>