SQLite的SQL文法詳解
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
SQLite3 安裝、基本操作
Ubuntu 12.04下SQLite資料庫簡單應用
Ubuntu 12.04下安裝 SQLite及其使用方法
ALTER TABLE
sql-statement ::= |
ALTER TABLE [database-name .]table-namealteration |
alteration ::= |
RENAME TO new-table-name |
alteration ::= |
ADD [COLUMN]column-def |
SQLite版本的的ALTER TABLE命令允許使用者重新命名或添加新的欄位到已有表中,不能從表中刪除欄位。
RENAME TO文法用於重新命名表名[database-name.]table-name到new-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子句擷取