sqlite00-SQLite的SQL语法

 

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

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 FROMfilename
[ 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 ASselect-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_”开头的表名是养数据库引擎使用的。

每个字段的概念是许段名后及字段的数据类型,接着是一个要多独底字段约束。字段的数据类型并无克字段中得以存放的数量。可以查阅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 ASselect-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语句以缺省模式下未减多少数据库文件的分寸。空间会养后来之INSERT语句以。要放删除产生的上空,可以采用VACUUM一声令下。若AUTOVACUUM模式被,则空间会自行为DROP
INDEX释放。

DROP TABLE

 

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

 

DROP TABLE语句删除由CREATE
TABLE言语创建的申。表将起数据库结构与磁盘文件中全除去,且无克恢复。该表的拥有索引也还要深受剔除。

DROP
TABLE语句以缺省模式下未减多少数据库文件之大大小小。空间会留下后来之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时实行该令所用动用的虚拟机指令序列,而未是的确执行该令。关于虚拟机指令的重多信息参见系统结构描述要么有关虚拟机的可用代码。

表达式

 

expr ::= expr binary-op expr |
expr [NOT] like-op expr [ESCAPE expr] |
unary-op expr |
expr ) |
column-name |
table-name . column-name |
database-name . table-name . column-name |
literal-value |
parameter |
function-name ( expr-list | * ) |
expr ISNULL |
expr NOTNULL |
expr [NOT] BETWEEN expr AND expr |
expr [NOT] IN ( value-list ) |
expr [NOT] IN ( select-statement ) |
expr [NOT] IN [database-name .] table-name |
[EXISTS] ( select-statement ) |
CASE 
[expr] ( WHEN expr THEN expr )+ [ELSE expr] END |
CAST ( 
expr AS type )
like-op ::= LIKE | GLOB | REGEXP

 

立刻等同省暨另的各节有所不同。我们谈谈的不是一个单一的SQL命令,而是作为其他多数命的一样片段的表达式。

SQLite支持如下的亚首位运算符,按先级由高至低排列:

|| *     /     % +     – <<    >>    &     | <    
<=    >     >= =     ==    !=    <>   

IN
AND    
OR

所支持之均等元运算符:

–     +     !     ~

顾等号以及“不等”号的蝇头单变种。等号可以是 =或==.
“不等”号可以是!=或<>. ||为“连接符”——它以片独字符串连接起来。 %出口左边有因右手有吗模取模得到的余数。

其次初运算符的结果均为数字,除了||连接符,它深受来字符串结果。

文本值(literal
value)是一个平头或浮点数。可以动用科学计数法。“.”符号总是让当小数点即使本地设定中用“,”来表示小数点——用“,”表示有点数沾会招致歧义。字符串常量由字符串加单引号“’”构成。字符串内部的单引号可像Pascal中平等用鲜个单引号来表示。C风格的加反斜线的象征法由于未是正经SQL而无吃支持。BLOB文以是盖“x”或“X”开头的包含十六前进制文本信息之文本值。例如:

X'53514697465'

文本值同样好为“NULL”。

表达式中插文本值占位符的参数可以采取sqlite3_bind API函数在运行时插入。参数可以是之类几种样式:

?NNN   问号跟随数字NNN为第NNN个参数占位。NNN需介于1和999之间。
?   不加数字的问号为下一个参数占位。
:AAAA   冒号带一个标识符名称为一个名为AAAA的参数占位。命名的参数同样可以使用序号占位,被赋予的参数序号为下一个尚未被使用的序号。建议不要混合使用命名代表的参数和序号代表的参数以免引起混淆。
$AAAA   $符号带一个标识符名称也可以为一个名为AAAA的参数占位。在这一情况下标识符名称可以包括一个或更多的“::”以及包含任何文本的“(…)”后缀。该语法是Tcl编程语言中的一个可变形式。

不使用sqlite3_bind赋值的参数为视为NULL。

LIKE运算符进行模式匹配比较。运算符右边也拓展匹配的模式要左边为用进行匹配的字符串。模式面临之百分号%匹配结果被之零或任意多独字符。下划线_相当任意单个字符。其他的任意字符匹配本身还是同一的大/小写字符。(即未分轻重缓急写的相当)。(一个bug:SQLite仅针对7-bit拉丁字符支持非分轻重缓急写匹配。这是由于LIKE运算符对8-bit
ISO8859字符或UTF-8字符是大大小小写敏感的。例如,表达式‘a’ LIKE
‘A’
的价也真正如‘æ’ LIKE ‘Æ’为假)。

使运用可摘的ESCAPE子句,则跟随ESCAPE关键字之得是一个生一个字符的字符串。这无异于字符(逃逸字符)可用于LIKE模式中,以代表百分号或下划线。逃逸字符后和百分号,下划线或她自身代表字符串中之百分号,下划线或逃逸字符。插入的LIKE运算符功能通过调用用户函数like(X,Y)来实现。

当以可摘的ESCAPE子句,它对函数给起第三只参数,LIKE的功力可以经过重载SQL函数like()进行转移。

GLOB运算符与LIKE相似,但它用Unix文件globbing语法作为过渡配符。还有一些不等是GLOB对大小写敏感。GLOB和LIKE都可以前缀NOT关键字组合相反的意思。插入的GLOB运算符功能通过调用用户函数glob(X,Y)得经过重载函数改变GLOB的功效。

REGEXP运算符是用户函数regexp()的一个不同寻常之代表符号。缺省情下regexp()函数不给定义,所以采用REGEXP运算符会报错。当运行时是用户定义的“regexp”函数的概念,则调用该函数以实现REGEXP运算符功能。

字段名可以是CREATE
TABLE语句子定义的旁名字或者如下几个独特标识符之一“ROWID”、“OID”以及“_ROWID_”。这些特种标识符均代表每个表列一样行关系的可怜唯一以机整数键“row
key”。仅仅在CREATE
TABLE语词没有对准这些独特标识符的真实字段给予定义之情事下,它们才表示“row
key”。它们和特念字段类似,可以像其他正规字段一样用,除了以UPDATE或INSERT语句被(即是说公切莫克添加要再次改row
key)。“SELECT * …”不返回row key。

SELECT语句可以当表达式中冒出,作为IN运算符的右手运算量,作为一个纯量,或作为EXISTS运算符的运算量。当作纯量或IN的运算量时,SELECT语句的结果只允许生一个字段,可以应用复合的SELECT(用UNION或
EXCEPT等要字连)。作为EXISTS运算符的运算量时,SELECT结果遭到之字段被忽视,在结果也空时表达式为假,反的乎实在。若SELECT表达式代表的询问中未含引用值的有的,则它将在拍卖其他工作之前受算,并且结果当必要经常见面为重复使用。若SELECT表达式含从另外查询中获的变量,在各个一样潮以时该表达式均让另行计算。

当SELECT作为IN运算符的右运算量,在左的运算量是SELECT产生的轻易一个值经常,表达式返回TRUE。IN运算符前好加NOT构成相反的意思。

当SELECT与表达式一同出现还非在IN的右,则SELECT结果的第一推行作为表达式中采用的价。SELECT返回的结果以首先实践以后的一些为忽略。返回结果为空时SELECT语句之值为NULL。

CAST表达式将的数据类型改吧声明的项目。可以是CREATE
TABLE语句字段定义有概念之针对该字段有效的人身自由非空数据类型。

表达式支持简函数和聚集函数。简单函数直接打输入获得结果,可用来其他表达式中。聚集函数使用结果集中的具有执行计算结果,仅用于SELECT语句被。

T下面这些函数是缺省可用的。可以用C语言写有别样的函数然后利用sqlite3_create_function()API函数添加至数据库引擎中。

 

abs(X) 返回参数X的绝对值。
coalesce(X,Y,…) 返回第一个非空参数的副本。若所有的参数均为NULL,返回NULL。至少2个参数。
glob(X,Y) 用于实现SQLite的 "X GLOB Y"语法。可使用 sqlite3_create_function() 重载该函数从而改变GLOB运算符的功能。
ifnull(X,Y) 返回第一个非空参数的副本。 若两个参数均为NULL,返回NULL。与上面的 coalesce()类似。
last_insert_rowid() 返回当前数据库连接最后插入行的ROWID。sqlite_last_insert_rowid()API函数同样可用于得到该值。
length(X) 返回X的长度,以字符计。如果SQLite被配置为支持UTF-8,则返回UTF-8字符数而不是字节数。
like(X,Y [,Z]) 用于实现SQL语法"X LIKE Y [ESCAPE Z]".若使用可选的ESCAPE子句,则函数被赋予三个参数,否则只有两个。可使用sqlite3_create_function() 重载该函数从而改变LIKE运算符的功能。
lower(X) 返回X字符串的所有字符小写化版本。这一转换使用C语言库的tolower()函数,对UTF-8字符不能提供好的支持。
max(X,Y,…) 返回最大值。参数可以不仅仅为数字,可以为字符串。大小顺序由常用的排序法则决定。注意,max()在有2个或更多参数时为简单函数,但当仅给出一个参数时它变为聚集函数。
min(X,Y,…) 返回最小值。与max()类似。
nullif(X,Y) 当两参数不同时返回X,否则返回NULL.
quote(X) 返回参数的适于插入其它SQL语句中的值。字符串会被添加单引号,在内部的引号前会加入逃逸符号。 BLOB被编码为十六进制文本。当前的VACUUM使用这一函数实现。在使用触发器实现撤销/重做功能时这一函数也很有用。
random(*) 返回介于-2147483648和 +2147483647之间的随机整数。
round(X)
round(X,Y)
X四舍五入,保留小数点后Y位。若忽略Y参数,则默认其为0。
soundex(X) 计算字符串X的soundex编码。参数为NULL时返回字符串“?000”。缺省的SQLite是不支持该函数的,当编译时选项 -DSQLITE_SOUNDEX=1 时该函数才可用。
sqlite_version(*) 返回所运行的SQLite库的版本号字符串。如 "2.8.0"。
substr(X,Y,Z) 返回输入字符串X中以第Y个字符开始,Z个字符长的子串。X最左端的字符序号为1。若Y为负,则从右至左数起。若SQLite配置支持UTF-8,则“字符”代表的是UTF-8字符而非字节。
typeof(X) 返回表达式X的类型。返回值可能为“null”、“integer”、“real”、“text”以及“blob”。SQLite的类型处理参见SQLite3的数据类型。
upper(X) 返回X字符串的所有字符大写化版本。这一转换使用C语言库的toupper()函数,对UTF-8字符不能提供好的支持。

 

以下是缺省可用之集聚函数列表。可以运用C语言写来任何的聚集函数然后用sqlite3_create_function() API函数添加至数据库引擎中。

于单参数聚集函数中,参数可以加前缀DISTINCT。这时再参数会吃过滤掉,然后才过入到函数中。例如,函数“count(distinct
X)”返回字段X的匪还非空值的个数,而非是字段X的通非空值。

 

avg(X) 返回一组中非空的X的平均值。非数字值作0处理。avg()的结果总是一个浮点数,即使所有的输入变量都是整数。

 

count(X)
count(*)
返回一组中X是非空值的次数的第一种形式。第二种形式(不带参数)返回该组中的行数。
max(X) 返回一组中的最大值。大小由常用排序法决定。
min(X) 返回一组中最小的非空值。大小由常用排序法决定。仅在所有值为空时返回NULL。
sum(X)
total(X)
返回一组中所有非空值的数字和。若没有非空行,sum()返回NULL而total()返回0.0。NULL通常情况下并不是对于“没有行”的和的一个有意义的结果,但SQL标准如此要求,且大部分其它SQL数据库引擎这样定义sum(),所以SQLite 也如此定义以保证兼容。我们提供非标准的total()函数作为解决该SQL语言设计问题的一个简易方法。

total()的返回值式中为浮点数。sum()可以为整数,当所有非空输入均为整数时,和是精确的。若sum()的任意一个输入既非整数也非NULL或计算中产生整数类型的溢出时,sum()返回接近真和的浮点数。

 

INSERT

 

sql-statement::= INSERT [OR conflict-algorithm] INTO [database-name .] table-name [(column-list)] VALUES(value-list|
INSERT 
[OR conflict-algorithm] INTO [database-name .] table-name [(column-list)] select-statement

 

INSERT语句有半点种植基本形式。一种含“VALUES”关键字,在就出表中插入一个新的执行。若不定义字段列表,那么值的数目将与表中的字段数目相同。否则值的数额须与字段列表中的字段数目相同。不以字段列表中的字段被予以缺省值或NULL(当不定义缺省值)。

INSERT的次栽样式从SELECT语句被获取数据。若未定义字段列表,则由SELECT得到的字段的数据必须跟表中的字段数目相同,否则应与定义的字段列表中之字段数目相同。SELECT的各级一行结果当表中插入一个初的条目。SELECT可以是简单的要么复合的。如果SELECT语句带有ORDER
BY子句,ORDER BY会被忽视。

以使即时无异命令时,利用而挑选的ON
CONFLICT子句可以定义替代的格冲突判定算法。更多信息,参见ON
CONFLICT。为了兼容MySQL,可以采取REPLACE代替“INSERT
OR REPLACE”。

ON CONFLICT子句

 

conflict-clause ::= ON CONFLICT conflict-algorithm
conflict-algorithm ::= ROLLBACK | ABORT | FAIL | IGNORE | REPLACE

 

ON
CONFLICT子句子不是独的SQL命令。这是一样长条好起于众别样SQL命令中的非标准的子句。由于它并无是正经的SQL语言,这里单独介绍她。

ON CONFLICT子句之语法在如齐之CREATE
TABLE命令中示出。对于INSERT和UPDATE,关键词“ON
CONFLICT”由“OR”替代,这样语法显得自然。例如,不用写“INSERT ON CONFLICT
IGNORE”而是“INSERT OR IGNORE”。二者表示一致之意思。

ON
CONFLICT子句定义了化解约冲突的算法。有五只选项:ROLLBACK、ABORT、FAIL、IGNORE和REPLACE,缺省方案是ABORT。选项含义如下:

ROLLBACK
当有约束冲突,立即ROLLBACK,即收目前事情处理,命令中止并返SQLITE_CONSTRAINT代码。若当前任动工作(除了各一样长达命令创建的默认事务以外),则该算法和ABORT相同。

ABORT
当起约束冲突,命令撤销已经招的变动并暂停返回SQLITE_CONSTRAINT。但出于不实行ROLLBACK,所以前面的命产生的改观将致保留。缺省使用当下无异行事。

FAIL
当起约束冲突,命令中止返回SQLITE_CONSTRAINT。但遇到冲突之前的富有改变将被保留。例如,若一长UPDATE语句以100推行遇到冲突100th,前99行的改变将于封存,而对100实践还是之后的变动将未会见生。

IGNORE
当有约束冲突,发生冲突的即将不见面吃插或转移。但令将照常执行。在冲突行之前要下的且被正常的插和改,且非返错误信息。

REPLACE
当起UNIQUE约束冲突,先有的,导致撞之实施于转或者插队发生冲突的行之前被去除。这样,更改和插总是给实践。命令照常执行还无回去错误信息。当有NOT
NULL约束冲突,导致撞的NULL值会被配段缺省值取代。若字段不管短缺省值,执行ABORT算法。

当冲突应针对政策也满足约束若除去时,它不会见调用删除触发器。但以新版中及时同一特性可能于改变。

INSERT或UPDATE的OR子句定义的算法会覆盖CREATE
TABLE所定义的。ABORT算法将于没有概念任何算法时缺省使用。

SQLite支持之编译指令(Pragma)

PRAGMA命令是用以修改SQlite库或询问SQLite库内部数据(non-table)的异常命令。PRAGMA
命令下和另SQLite命令(例如:SELECT、INSERT)相同之接口,但当如下主要方面跟其它命令不同:

  • 每当未来底SQLite版本中部分Pragma可能于剔除或长,要小心用。
  • 当使用未知之Pragma语句时未发生报错。未知的Pragma仅仅会受忽略,即是说若是打错了Pragma语句SQLite不会见唤起用户。
  • 有的Pragma在SQL编译阶段生效而不执行等级。即凡说如果采用C语言的sqlite3_compile()、sqlite3_step()、sqlite3_finalize()
    API(或近似的封装接口中),Pragma可能以调用sqlite3_compile()期间从作用。
  • Pragma命令不跟另SQL引擎兼容。

可用之pragma命令有如下四个为主类型:

  • 用于观测当前数据库的模式。
  • 用于改SQLite库的操作抑或询问时底操作模式。
  • 用于询问或修改两单数据库的版本号,schema-version和user-version.
  • 用于调试库以及校验数据库文件。

PRAGMA命令语法

 

sql-statement ::= PRAGMA name [value] |
PRAGMA 
function(arg)

 

使用整数值value的pragma也得以用标志表示,字符串“on”、“true”和“yes”等同于1,“off”、“false”和“no”等同于0。这些字符串大小写不敏感且毫无进行引用。无法辨识的字符串被看做1还不见面报错。value返回时是整数。


用以修改SQLite库的操作的Pragma

  • PRAGMA auto_vacuum; 
    PRAGMA auto_vacuum = *
    0 | 1*;

    询问或设置数据库的auto-vacuum标记。

    正常状况下,当提交一个自数据库中去除数据的工作时,数据库文件未改动大小。未利用的文本页为标记并当后头的长操作着另行用。这种情景下以VACUUM一声令下释放删除得到的半空中。

    当开启auto-vacuum,当提交一个于数据库中删去数据的事务时,数据库文件自动收缩,(VACUUM命令在auto-vacuum开启之数据库中不起作用)。数据库会在中存储一些消息以便支持就等同职能,这让数据库文件较无开起来该选择时不怎么大组成部分。

    只有当数据库中无打其他表时才能够转auto-vacuum标记。试图以已有表的动静下修改不见面造成报错。

  • PRAGMA cache_size; 
    PRAGMA cache_size = *
    Number-of-pages*;

    询问或涂改SQLite一次于存储在内存中的数据库文件页数。每页使用约1.5K内存,缺省的休息存大小是2000。若需运用改变大量多行的UPDATE或DELETE命令,并且不介意SQLite使用更多之内存的话,可以叠加缓存以增长性能。

    当使用cache_size
    pragma改变缓存大小时,改变才对时对话中,当数据库关闭重新打开时缓存大小恢复至缺省大大小小。要惦记永远改变缓存大小,使用default_cache_size pragma。

  • PRAGMA case_sensitive_like; 
    PRAGMA case_sensitive_like = *
    0 | 1*;

    LIKE运算符的缺省行为是忽略latin1字符的大大小小写。因此当少省气象下‘a’
    LIKE ‘A’
    的价为确实。可以通过打开case_sensitive_like
    pragma来改变及时等同短省行。当启用case_sensitive_like,‘a’ LIKE
    ‘A’
    为假而 ‘a’ LIKE ‘a’还为实在。

  • PRAGMA count_changes; 
    PRAGMA count_changes = *
    0 | 1*;

    询问或变更count-changes标记。正常情况下INSERT,
    UPDATE和DELETE语句不归数据。当被count-changes,以上语句返回一行含一个整数值的数码——该语句插入、修改或者删除的行数。返回的行数不包由触发器产生的插、修改要删除等反之行数。

  • PRAGMA default_cache_size; 
    PRAGMA default_cache_size = *
    Number-of-pages*;

    查询或改动SQLite一糟糕存储于内存中的数据库文件页数。每页使用约1.5K内存,它和cache_sizepragma类似,只是其永久性地改成缓存大小。利用该pragma,你可以设定一差缓存大小,并且每次重复打开数据库时犹蝉联使用该值。

  • PRAGMA default_synchronous;

    该语句以2.8本子中可用,但每当3.0版备受受失去丢了。这漫漫pragma很悬且非引进用,安全打表现在该文档中未干此pragma的用法。

  • PRAGMA empty_result_callbacks; 
    PRAGMA empty_result_callbacks = *
    0 | 1*;

    查询或再改empty-result-callbacks标记。

    empty-result-callbacks标记就影响sqlite3_exec
    API函数。正常状态下,empty-result-callbacks标记清空,则针对回到0行数据的下令不调用sqlite3_exec()的回叫函数,当装了empty-result-callbacks,则调用回叫
    函数一次,置第三单参数为0(NULL)。这叫用sqlite3_exec()
    API的顺序就算以相同修查询不返数据常常依然检索字段名。

  • PRAGMA encoding; 
    PRAGMA encoding = “UTF-8”; 
    PRAGMA encoding = “UTF-16”; 
    PRAGMA encoding = “UTF-16le”; 
    PRAGMA encoding = “UTF-16be”;

    于率先栽形式中,若主数据库都开立,这长达pragma返回主数据库使用得文本编码格式,为“UTF-8”、“UTF-16le”(little-endian
    UTF-16 encoding)或者“UTF-16be”(big-endian UTF-16
    encoding)中之均等种植。
    若主数据库未创建,返回值为当前对话创建的主数据库将要以的公文编码格式。

    仲栽和以后几乎种植形式就在主数据库未创建时有效。这时该pragma设置当前对话创建的主数据库将要利用的文本编码格式。“UTF-16”表示“使用本机字节顺序的UTF-16编码”。若这些样式在主数据库创建后动,将于忽略且无起其它成效。

    数据库的编码格式设置后不克为改动。

    ATTACH命令创建的数据库使用及主数据库相同之编码格式。

  • PRAGMA full_column_names; 
    PRAGMA full_column_names = *
    0 | 1*;

    询问或再次改the
    full-column-names标记。该标记影响SQLite命名SELECT语句(当字段表达式为表-字段或连配符”*”时)返回的许段名的点子。正常情形下,当SELECT语句以鲜独或多个说明连接时,这类结果字段的回到名也,当SELECT语句询问一个独自的表时,返回字段名也。当装了full-column-names标记,返回的字段名将统一吗
    不管是否对表进行了连续。

    若short-column-names及full-column-names标记同时于装,则采取full-column-names方式。

  • PRAGMA fullfsync 
    PRAGMA fullfsync = *
    0 | 1*;

    询问或重复改fullfsync标记。该标记决定是否以支持的体系上使用F_FULLFSYNC同步模式。缺省值为off。截至目前(2006-02-10)只发生Mac
    OS X系统支持F_FULLFSYNC。

  • PRAGMA page_size; 
    PRAGMA page_size = *
    bytes*;

    查询或安装page-size值。只有以未创建数据库时才会设置page-size。页面大小要是2之平头倍且高于等于512仅次于等于8192。上限可以经在编译时修改宏定义SQLITE_MAX_PAGE_SIZE的值来转。上限的上限是32768。

  • PRAGMA read_uncommitted; 
    PRAGMA read_uncommitted = *
    0 | 1*;

    查询,设置或解除READ UNCOMMITTED
    isolation(读取未授权的分隔符)。缺省的SQLite分隔符等级是SERIALIZABLE。任何线程或进程而选用READ
    UNCOMMITTED
    isolation,但除共享公共页和schema缓存的总是之间以外的地方吗会以SERIALIZABLE。缓存共享通过sqlite3_enable_shared_cache() API开启,且仅于运作同一线程的连日间行。缺省气象下缓存共享是关的。

  • PRAGMA short_column_names; 
    PRAGMA short_column_names = *
    0 | 1*;

    查询或更改the
    short-column-names标记。该标记影响SQLite命名SELECT语句(当字段表达式为表-字段或连配符”*”时)返回的许段名的道。正常情况下,当SELECT语句以简单只或多只说明连接时,这类结果字段的回来名也,当SELECT语句询问一个独立的表时,返回字段名也。当装了full-column-names标记,返回的字段名将统一为无是否对表进行了连接。

    若short-column-names以及full-column-names标记同时让设置,则使用full-column-names方式。

  • PRAGMA synchronous; 
    PRAGMA synchronous = FULL; 
    (2) 
    PRAGMA synchronous = NORMAL; 
    (1) 
    PRAGMA synchronous = OFF; 
    (0)

    询问或变更“synchronous”标记的设定。第一栽样式(查询)返回整数值。
    当synchronous设置也FULL(2),SQLite数据库引擎在迫不及待时刻会暂停为确定数据已经勾勒副磁盘。这如果系统崩溃或电源出问题时亦可管数据库在重起后不见面坏。FULL
    synchronous很安全而老缓慢。当synchronous设置为NORMAL,SQLite数据库引擎在大多数急时刻会停顿,但非像FULL模式下那么累。NORMAL模式下产生不行有些之几带领(但切莫是不设有)发生电源故障导致数据库损坏的情状。但实际上,在这种场面下好可能而的硬盘已经不能够以,或者出了别样的不足恢复的硬件错误。设置为synchronous
    OFF(0)时,SQLite在传递数据给系统之后直接接轨要无间歇。若运行SQLite的应用程序崩溃,数据未会见危害,但每当系统崩溃或摹写副数据时意外断电的情景下数据库可能会见坏。另一方面,在synchronous
    OFF时有的操作可能会见尽快50加倍甚至更多。

    每当SQLite2中,缺省值为NORMAL,而当3着改也FULL。

  • PRAGMA temp_store; 
    PRAGMA temp_store = DEFAULT;
     (0) 
    PRAGMA temp_store = FILE;
     (1) 
    PRAGMA temp_store = MEMORY;
     (2)

    查询或改动“temp_store”参数的安。当temp_store设置为DEFAULT(0),使用编译时之C预处理宏TEMP_STORE来定义储存临时表和临时索引的职务。当装为MEMORY(2)临时表和目录存放于外存中。当装也FILE(1)则存放于文件被。temp_store_directory
    pragma可用以指定存放该文件的目。当改变temp_store设置,所有已是的临时表、索引、触发器及视图将受这删除。

    库中之编译时C预处理标志TEMP_STORE可以挂该pragma设置。下面的表给出TEMP_STORE预处理宏和temp_store
    pragma交互作用的总:

    TEMP_STORE PRAGMA
    temp_store
    临时表和索引
    使用的存储方式
    0 any 文件
    1 0 文件
    1 1 文件
    1 2 内存
    2 0 内存
    2 1 文件
    2 2 内存
    3 any 内存
  • PRAGMA temp_store_directory; 
    PRAGMA temp_store_directory = ‘directory-name’;

    询问或转移“temp_store_directory”设置——存储临时表和目录的文件所在的目。仅在此时此刻连日有效,在起新连时重置为少省值。

    当改变了temp_store_directory设置,所有已有的临时表、索引、触发器、视图会让直接去。建议在数据库一打开时便设置好temp_store_directory。

    directory-name用用单引号引起来。要惦记恢复缺乏省目录,把directory-name假如为空字符串。例如PRAGMA
    temp_store_directory =
    。若directory-name切莫找到或不足写会抓住错误。

    临时文件的缺省目录及主机的系统有关,使用Unix/Linux/OSX系统的主机,缺省目录是之类序列内第一独可写的/var/tmp、/usr/tmp、/tmp、current-directory。对于Windows
    NT,缺省目录由Windows决定,一般为C:/Documents and
    Settings/user-name/Local
    Settings/Temp/
    。SQLite创建的临时文件在运用完时就是叫unlink,所以操作系统可以在SQLite进程展开中机动删除临时文件。于是,正常情形下非克透过lsdir命看到临时文件。


用以查询数据库的schema的Pragma

  • PRAGMA database_list;

    本着每个打开的数据库,使用该数据库的信息调用一不行回被函数。使用包括附加的多少库名和索引名在内的参数。第一实行用于主数据库,第二推行用于存放临时表的即数据库。

  • PRAGMA foreign_key_list(*table-name*);

    对参数表中每个涉及到字段的外键,使用该外键的音调用一坏回被函数。每个外键中的每个字段都用调用一软回为函数。

  • PRAGMA index_info(*index-name*);

    针对该索引涉及到的每个字段,使用字段信息(字段名、字段号)调用一赖回为函数。

  • PRAGMA index_list(*table-name*);

    本着表中的每个索引,使用索引信息调用回叫函数。参数包括索引名和一个指令索引是否唯一的表明。

  • PRAGMA table_info(*table-name*);

    对于表中的每个字段,使用字段信息(字段名、数据类型、可否为空、缺省值)调用回叫函数。


用于查询/更改版本信息的Pragma

  • PRAGMA [database.]schema_version; 
    PRAGMA [database.]schema_version = *
    integer 
    PRAGMA [database.]user_version; 
    PRAGMA [database.]user_version = 
    integer *;

    即简单长条pragma分别用于安装schema-version和user-version的价值。schema-version和user-version均为32位来记号整数,存放于数库头中。

    schema-version通常只由SQLite内部操作。每当数据库的Schema改变时(创建或者注销消表或索引),SQLite将是价增大。Schema版本在各国一样不良Query被实施时叫SQLite所使用,以确定编译SQL
    Query时中Cache的Schema与编译后底Query实际执行时数据库的Schema相兼容。使用“PRAGMA
    schema_version”更改schema-version会摔就无异编制,有致程序崩溃或数据库损坏的秘密危险。请小心用!

    user-version不在SQLite内部用,任何程序可以就此它们来举行另外事。


用于库Debug的Pragma

  • PRAGMA integrity_check;

    欠令对合数据库进行完整性检查,查找次序颠倒的记录,丢失的页,残缺的记录及破坏的目。若发现任何问题虽然归一形容问题所在的字符串,若一切正常返回“ok”。

  • PRAGMA parser_trace = ON; (1) 
    PRAGMA parser_trace = OFF;
     (0)

    开拓或关闭SQLite库中之SQL语法分析追踪,用于Debug。只有当SQLite不使用NDEBUG宏进行编译时该pragma才可用。

  • PRAGMA vdbe_trace = ON; (1) 
    PRAGMA vdbe_trace = OFF;
     (0)

    打开或关闭SQLite库中之虚构数据库引擎追踪,用于Debug。更多信息,查看 VDBE文档。

  • PRAGMA vdbe_listing = ON; (1) 
    PRAGMA vdbe_listing = OFF;
     (0)

    开拓或关闭虚拟机程序列表,当展列表功能,整个程序的始末在实施前吃打印出来,就像以各个条语句之前自动执行EXPLAIN。语句以打印列表之后正常履。用于Debug。更多信息,查看VDBE文档。

REINDEX

 

sql-statement ::= REINDEX collation name
sql-statement ::= REINDEX [database-name .] table/index-name

 

REINDEX命令用于去并起草稿重建索引。当于顺序改变时欠令显得挺管用。

在首先种植形式中,所有附加数据库被利用该比顺序的目均于重建。在亚种植样式被,[database-name.]table/index-name标识出一个说明,所有涉及该表的目录被重建。若标识出索引,则光该索引为删并重建。

万一未指定database-name若指定表/索引名以及比较顺序,只有关联该比顺序的目录被重建。在重建索引时连日指定database-name可祛除这无异歧义。

REPLACE

 

sql-statement::= REPLACE INTO [database-name .] table-name [column-list )] VALUES (value-list ) |
REPLACE INTO 
[database-name .] table-name [column-list )] select-statement

 

REPLACE命令用于代替INSERT的“INSERT
OR
REPLACE”变体,以还好之兼容MySQL。查看INSERT命文档获取更多信息。

SELECT

 

sql-statement ::= SELECT [ALL | DISTINCT] result [FROM table-list]
[WHERE expr]
[GROUP BY expr-list]
[HAVING expr]
[compound-op select]*
[ORDER BY sort-expr-list]
[LIMIT integer [( OFFSET | , ) integer]]
result ::= result-column [result-column]*
result-column ::= | table-name . * | expr [ [AS] string ]
table-list ::= table [join-op table join-args]*
table ::= table-name [AS alias] |
select ) [AS alias]
join-op ::= | [NATURAL] [LEFT | RIGHT | FULL] [OUTER | INNER | CROSS] JOIN
join-args ::= [ON expr] [USING ( id-list )]
sort-expr-list ::= expr [sort-order] [expr [sort-order]]*
sort-order ::= [ COLLATE collation-name ] [ ASC | DESC ]
compound_op ::= UNION | UNION ALL | INTERSECT | EXCEPT

 

SELECT语句用于查询数据库。一久SELECT命令的归来结果是散还是多行每行有定点字段往往的多寡。字段的多寡由在SELECT和FROM之间的表达式列表定义。任意的表达式都好被作结果。若表达式是 *虽然代表所有表的所有字段。若表达式是表明的讳后接.*则结果吧该表中的富有字段。

DISTINCT关键字的用会要返回的结果是原本结果的一个无含相同行之子集。NULL值被认为是如出一辙的。缺省行是回所有的行,为掌握起见可以动用主要字ALL。

查询对FROM之后定义的一个或者多个说明展开。若多单表用逗号连接,则查询针对其的穿插连接。所有的SQL-92连接语法均可以用于定义连接。圆括号丁之称查询可能吃FROM子句被的任意表名替代。当结果遭到唯有发生相同履行包含表达式列表中之结果的风靡,整个的FROM子句会吃忽视。

WHERE子句子可以界定查询操作的实践数目。

GROUP
BY子句以一行要多行结果合成单行输出。当结果有集函数时立即将尤其有因此。GROUP
BY子句的表达式不须举凡出现在结果吃之表达式。HAVING子句与WHERE相似,只是HAVING用于过滤分组创建的履。HAVING子句可能含值,甚至是匪发本结果遭到的联谊函数。

ORDER
BY子句子针对所得结果因表达式排序。表达式无须是简约SELECT的结果,但当复合SELECT中每个表达式必须可靠对应一个结出字段。每个表达式可能从一个可选的COLLATE关键字与用于排序文本的比函数名称以及/或根本字ASC或DESC,用于证明排序规则。

LIMIT子句子限定行数的卓绝要命

 

SQLite的SQL语法

标签: sqlitesql数据库conflictinserttable

2011-03-05 01:27 128538人阅读 评论(4) 收藏 举报

 

目录(?)[+]

 

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 FROMfilename
[ 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 ASselect-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_”开头的表名是留给数据库引擎使用的。

每个字段的概念是配段名后及字段的数据类型,接着是一个要多只的字段约束。字段的数据类型并无限定字段中得以存放的多寡。可以翻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 ASselect-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语句以缺省模式下非减多少数据库文件之大大小小。空间会留后来的INSERT语句以。要自由删除产生的长空,可以利用VACUUM命令。若AUTOVACUUM模式被,则空间会活动为DROP
INDEX释放。

DROP TABLE

 

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

 

DROP TABLE语句删除由CREATE
TABLE话创建的表。表将自数据库结构和磁盘文件被完全除去,且非能够还原。该表的拥有索引也以吃去除。

DROP
TABLE语句以缺省模式下不弱化多少数据库文件之大小。空间会留给后来底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时实施该令所用使用的虚拟机指令序列,而未是真执行该令。关于虚拟机指令的更多信息参见系统结构描述抑或有关虚拟机的可用代码。

表达式

 

expr ::= expr binary-op expr |
expr [NOT] like-op expr [ESCAPE expr] |
unary-op expr |
expr ) |
column-name |
table-name . column-name |
database-name . table-name . column-name |
literal-value |
parameter |
function-name ( expr-list | * ) |
expr ISNULL |
expr NOTNULL |
expr [NOT] BETWEEN expr AND expr |
expr [NOT] IN ( value-list ) |
expr [NOT] IN ( select-statement ) |
expr [NOT] IN [database-name .] table-name |
[EXISTS] ( select-statement ) |
CASE 
[expr] ( WHEN expr THEN expr )+ [ELSE expr] END |
CAST ( 
expr AS type )
like-op ::= LIKE | GLOB | REGEXP

 

即时无异于省及外的各节有所不同。我们讨论的莫是一个单一的SQL命令,而是作为任何大部下令的相同有的的表达式。

SQLite支持如下的第二头版运算符,按优先级由大到低排列:

|| *     /     % +     – <<    >>    &     | <    
<=    >     >= =     ==    !=    <>   

IN
AND    
OR

所支撑之一律头运算符:

–     +     !     ~

瞩目等号与“不等”号的有数独变种。等号可以是 =或==.
“不等”号可以是!=或<>. ||为“连接符”——它将鲜个字符串连接起来。 %出口左边有盖右手有为模取模得到的余数。

第二状元运算符的结果都为数字,除了||连接符,它为起字符串结果。

文本值(literal
value)是一个整数或浮点数。可以利用科学计数法。“.”符号总是为作小数点即使本地设定中用“,”来表示小数点——用“,”表示小数碰见面导致歧义。字符串常量由字符串加单引号“’”构成。字符串内部的单引号可像Pascal中同用有限只单引号来表示。C风格的加反斜线的象征拟由于未是标准SQL而不吃支持。BLOB文以是以“x”或“X”开头的盈盈十六进制文本信息的文本值。例如:

X'53514697465'

文本值同样好吗“NULL”。

表达式中插入文本值占位符的参数可以动用sqlite3_bind API函数在运行时插入。参数可以是之类几栽样式:

?NNN   问号跟随数字NNN为第NNN个参数占位。NNN需介于1和999之间。
?   不加数字的问号为下一个参数占位。
:AAAA   冒号带一个标识符名称为一个名为AAAA的参数占位。命名的参数同样可以使用序号占位,被赋予的参数序号为下一个尚未被使用的序号。建议不要混合使用命名代表的参数和序号代表的参数以免引起混淆。
$AAAA   $符号带一个标识符名称也可以为一个名为AAAA的参数占位。在这一情况下标识符名称可以包括一个或更多的“::”以及包含任何文本的“(…)”后缀。该语法是Tcl编程语言中的一个可变形式。

不使用sqlite3_bind赋值的参数为视为NULL。

LIKE运算符进行模式匹配比较。运算符右边也进行匹配的模式使左边为急需进行匹配的字符串。模式受到的百分号%配合结果吃之零或任意多单字符。下划线_匹配任意单个字符。其他的任意字符匹配本身要同一的大/小写字符。(即非分轻重缓急写的匹配)。(一个bug:SQLite仅针对7-bit拉丁字符支持非分轻重缓急写匹配。这是由于LIKE运算符对8-bit
ISO8859字符或UTF-8字符是高低写敏感的。例如,表达式‘a’ LIKE
‘A’
的值也真要‘æ’ LIKE ‘Æ’为假)。

若是使用可选取的ESCAPE子句,则跟随ESCAPE关键字之须是一个发一个字符的字符串。这等同字符(逃逸字符)可用于LIKE模式受到,以代百分号或生划线。逃逸字符后同百分号,下划线或她自己代表字符串中之百分号,下划线或逃逸字符。插入的LIKE运算符功能通过调用用户函数like(X,Y)来实现。

当用可选的ESCAPE子句,它对函数给来第三独参数,LIKE的意义可由此重载SQL函数like()进行变更。

GLOB运算符与LIKE相似,但它们采用Unix文件globbing语法作为过渡配符。还有少数不同是GLOB对大小写敏感。GLOB和LIKE都得以前缀NOT关键字组合相反的意思。插入的GLOB运算符功能通过调用用户函数glob(X,Y)可透过重载函数改变GLOB的功力。

REGEXP运算符是用户函数regexp()的一个新鲜之表示符号。缺省情下regexp()函数不受定义,所以采取REGEXP运算符会报错。当运行时存在用户定义的“regexp”函数的概念,则调用该函数以实现REGEXP运算符功能。

许段名可以是CREATE
TABLE语句定义的其他名字或如下几只例外标识符之一“ROWID”、“OID”以及“_ROWID_”。这些特别标识符均代表每个表列一样执关系的慌唯一以机整数键“row
key”。仅仅在CREATE
TABLE语句子没有指向这些突出标识符的实事求是字段给予定义的场面下,它们才代表“row
key”。它们同仅仅读字段类似,可以像其它正规字段一样以,除了在UPDATE或INSERT语句被(即是说你不克填补加要再次改row
key)。“SELECT * …”不返回row key。

SELECT语句可以以表达式中出现,作为IN运算符的右侧运算量,作为一个纯量,或当作EXISTS运算符的运算量。当作纯量或IN的运算量时,SELECT语句的结果单同意生一个字段,可以以复合的SELECT(用UNION或
EXCEPT等重要字连)。作为EXISTS运算符的运算量时,SELECT结果遭遇之字段被忽略,在结果也空时表达式为假,反的吗确实。若SELECT表达式代表的询问中未分包引用值的组成部分,则它以以处理其他工作之前让计算,并且结果在必要时会叫重复使用。若SELECT表达式含从外查询中赢得的变量,在各一样坏以时欠表达式均被重复计算。

当SELECT作为IN运算符的右运算量,在左的运算量是SELECT产生的随机一个值经常,表达式返回TRUE。IN运算符前好加NOT构成相反的意。

当SELECT与表达式一同出现还未以IN的右边,则SELECT结果的第一履行作为表达式中采用的价值。SELECT返回的结果当率先实施以后的一些被忽略。返回结果吗空时SELECT语句的值为NULL。

CAST表达式将的数据类型改也声明的类型。可以是CREATE
TABLE语句字段定义有概念的针对拖欠字段有效之自由非空数据类型。

表达式支持简函数和集函数。简单函数直接从输入获得结果,可用来其他表达式中。聚集函数使用结果集中之有着执行计算结果,仅用于SELECT语句被。

T下面这些函数是缺省可用之。可以采用C语言写起另的函数然后用sqlite3_create_function()API函数添加到数据库引擎中。

 

abs(X) 返回参数X的绝对值。
coalesce(X,Y,…) 返回第一个非空参数的副本。若所有的参数均为NULL,返回NULL。至少2个参数。
glob(X,Y) 用于实现SQLite的 "X GLOB Y"语法。可使用 sqlite3_create_function() 重载该函数从而改变GLOB运算符的功能。
ifnull(X,Y) 返回第一个非空参数的副本。 若两个参数均为NULL,返回NULL。与上面的 coalesce()类似。
last_insert_rowid() 返回当前数据库连接最后插入行的ROWID。sqlite_last_insert_rowid()API函数同样可用于得到该值。
length(X) 返回X的长度,以字符计。如果SQLite被配置为支持UTF-8,则返回UTF-8字符数而不是字节数。
like(X,Y [,Z]) 用于实现SQL语法"X LIKE Y [ESCAPE Z]".若使用可选的ESCAPE子句,则函数被赋予三个参数,否则只有两个。可使用sqlite3_create_function() 重载该函数从而改变LIKE运算符的功能。
lower(X) 返回X字符串的所有字符小写化版本。这一转换使用C语言库的tolower()函数,对UTF-8字符不能提供好的支持。
max(X,Y,…) 返回最大值。参数可以不仅仅为数字,可以为字符串。大小顺序由常用的排序法则决定。注意,max()在有2个或更多参数时为简单函数,但当仅给出一个参数时它变为聚集函数。
min(X,Y,…) 返回最小值。与max()类似。
nullif(X,Y) 当两参数不同时返回X,否则返回NULL.
quote(X) 返回参数的适于插入其它SQL语句中的值。字符串会被添加单引号,在内部的引号前会加入逃逸符号。 BLOB被编码为十六进制文本。当前的VACUUM使用这一函数实现。在使用触发器实现撤销/重做功能时这一函数也很有用。
random(*) 返回介于-2147483648和 +2147483647之间的随机整数。
round(X)
round(X,Y)
X四舍五入,保留小数点后Y位。若忽略Y参数,则默认其为0。
soundex(X) 计算字符串X的soundex编码。参数为NULL时返回字符串“?000”。缺省的SQLite是不支持该函数的,当编译时选项 -DSQLITE_SOUNDEX=1 时该函数才可用。
sqlite_version(*) 返回所运行的SQLite库的版本号字符串。如 "2.8.0"。
substr(X,Y,Z) 返回输入字符串X中以第Y个字符开始,Z个字符长的子串。X最左端的字符序号为1。若Y为负,则从右至左数起。若SQLite配置支持UTF-8,则“字符”代表的是UTF-8字符而非字节。
typeof(X) 返回表达式X的类型。返回值可能为“null”、“integer”、“real”、“text”以及“blob”。SQLite的类型处理参见SQLite3的数据类型。
upper(X) 返回X字符串的所有字符大写化版本。这一转换使用C语言库的toupper()函数,对UTF-8字符不能提供好的支持。

 

以下是缺省可用的集聚函数列表。可以使C语言写起另的聚集函数然后用sqlite3_create_function() API函数添加到数据库引擎中。

当单参数聚集函数中,参数可以加前缀DISTINCT。这时又参数会叫过滤掉,然后才过入到函数中。例如,函数“count(distinct
X)”返回字段X的无更非空值的个数,而未是字段X的全非空值。

 

avg(X) 返回一组中非空的X的平均值。非数字值作0处理。avg()的结果总是一个浮点数,即使所有的输入变量都是整数。

 

count(X)
count(*)
返回一组中X是非空值的次数的第一种形式。第二种形式(不带参数)返回该组中的行数。
max(X) 返回一组中的最大值。大小由常用排序法决定。
min(X) 返回一组中最小的非空值。大小由常用排序法决定。仅在所有值为空时返回NULL。
sum(X)
total(X)
返回一组中所有非空值的数字和。若没有非空行,sum()返回NULL而total()返回0.0。NULL通常情况下并不是对于“没有行”的和的一个有意义的结果,但SQL标准如此要求,且大部分其它SQL数据库引擎这样定义sum(),所以SQLite 也如此定义以保证兼容。我们提供非标准的total()函数作为解决该SQL语言设计问题的一个简易方法。

total()的返回值式中为浮点数。sum()可以为整数,当所有非空输入均为整数时,和是精确的。若sum()的任意一个输入既非整数也非NULL或计算中产生整数类型的溢出时,sum()返回接近真和的浮点数。

 

INSERT

 

sql-statement::= INSERT [OR conflict-algorithm] INTO [database-name .] table-name [(column-list)] VALUES(value-list|
INSERT 
[OR conflict-algorithm] INTO [database-name .] table-name [(column-list)] select-statement

 

INSERT语句有零星种为主形式。一栽含“VALUES”关键字,在已生表中插入一个新的实践。若无定义字段列表,那么值的多寡将与表中的字段数目相同。否则值的数据须与字段列表中的字段数目相同。不以字段列表中的字段被赋予缺省值或NULL(当不定义缺省值)。

INSERT的老二种植形式从SELECT语句被获取数据。若无定义字段列表,则由SELECT得到的字段的数目必须与表中的字段数目相同,否则应与概念的字段列表中的字段数目相同。SELECT的每一行结果当表中插入一个新的条文。SELECT可以是概括的抑复合的。如果SELECT语句带有ORDER
BY子句,ORDER BY会被忽略。

以运即时等同下令时,利用而挑选的ON
CONFLICT子句可以定义替代的格冲突判定算法。更多信息,参见ON
CONFLICT。为了兼容MySQL,可以用REPLACE代替“INSERT
OR REPLACE”。

ON CONFLICT子句

 

conflict-clause ::= ON CONFLICT conflict-algorithm
conflict-algorithm ::= ROLLBACK | ABORT | FAIL | IGNORE | REPLACE

 

ON
CONFLICT子句子不是单独的SQL命令。这是同长可以出现在广大另SQL命令中之非标准的子句。由于其并无是正统的SQL语言,这里单独介绍她。

ON CONFLICT子句之语法在苟齐的CREATE
TABLE命令中示出。对于INSERT和UPDATE,关键词“ON
CONFLICT”由“OR”替代,这样语法显得自然。例如,不用写“INSERT ON CONFLICT
IGNORE”而是“INSERT OR IGNORE”。二者表示同样的意思。

ON
CONFLICT子词定义了缓解约冲突之算法。有五个挑选:ROLLBACK、ABORT、FAIL、IGNORE和REPLACE,缺省方案是ABORT。选项含义如下:

ROLLBACK
当有约束冲突,立即ROLLBACK,即收目前业务处理,命令中止并回到SQLITE_CONSTRAINT代码。若当前任动工作(除了各一样长达命令创建的默认事务以外),则该算法和ABORT相同。

ABORT
当有约束冲突,命令撤销已经引起的改变并暂停返回SQLITE_CONSTRAINT。但出于未履行ROLLBACK,所以前面的授命产生的改动将给予保留。缺省运即时等同行事。

FAIL
当有约束冲突,命令中止返回SQLITE_CONSTRAINT。但遇到冲突之前的兼具变更将受保存。例如,若一条UPDATE语句以100行遇到冲突100th,前99行的变动将为保存,而对100推行抑下的转移将不见面起。

IGNORE
当有约束冲突,发生冲突的且不会见吃插或变更。但令将照常执行。在冲突行之前要后的将被正常的插入和转,且未回错误信息。

REPLACE
当有UNIQUE约束冲突,先有的,导致撞的施行以改动或插队发生冲突的行之前为删除。这样,更改和插总是为实践。命令照常执行都未归错误信息。当起NOT
NULL约束冲突,导致冲突之NULL值会被配段缺省值取代。若字段不管缺失省值,执行ABORT算法。

当冲突应本着政策也满足约束若除去时,它不会见调用删除触发器。但于新版遭遇就等同特色可能让反。

INSERT或UPDATE的OR子句定义之算法会覆盖CREATE
TABLE所定义的。ABORT算法将在并未概念任何算法时缺省使用。

SQLite支持的编译指令(Pragma)

PRAGMA命令是用以修改SQlite库或询问SQLite库内部数据(non-table)的奇异命令。PRAGMA
命令下以及外SQLite命令(例如:SELECT、INSERT)相同的接口,但每当如下主要点和其他命令不同:

  • 于未来底SQLite版本中有的Pragma可能为去除或抬高,要小心用。
  • 当使用未知的Pragma语句时不来报错。未知之Pragma仅仅会给忽视,即凡是说若是由错了Pragma语句SQLite不见面唤醒用户。
  • 局部Pragma在SQL编译阶段生效而未执行等级。即凡是说如果使C语言的sqlite3_compile()、sqlite3_step()、sqlite3_finalize()
    API(或近乎的封装接口中),Pragma可能以调用sqlite3_compile()期间从作用。
  • Pragma命令不跟任何SQL引擎兼容。

可用之pragma命令有如下四单核心型:

  • 用于相当前数据库的模式。
  • 用于修改SQLite库的操作要询问时底操作模式。
  • 用于查询或修改两只数据库的本子号,schema-version和user-version.
  • 用于调试库和校验数据库文件。

PRAGMA命令语法

 

sql-statement ::= PRAGMA name [value] |
PRAGMA 
function(arg)

 

应用整数值value的pragma也堪运用标志表示,字符串“on”、“true”和“yes”等同于1,“off”、“false”和“no”等同于0。这些字符串大小写不灵动且不要进行引用。无法识别的字符串被看作1都非会见报错。value归来时凡整数。


用以修改SQLite库的操作的Pragma

  • PRAGMA auto_vacuum; 
    PRAGMA auto_vacuum = *
    0 | 1*;

    查询或安装数据库的auto-vacuum标记。

    常规状态下,当提交一个起数据库被去数据的作业时,数据库文件未转移大小。未运的文本页为记并以随后的长操作中更利用。这种情景下下VACUUM命释放删除得到的长空。

    当开启auto-vacuum,当提交一个自数据库被去除数据的事务时,数据库文件自动收缩,(VACUUM命令在auto-vacuum开启的数据库被不起作用)。数据库会在其间存储一些音讯以便支持就同效益,这使数据库文件较未起起该选择时稍大一些。

    除非在数据库被未修其他表时才会更改auto-vacuum标记。试图以曾有表的情形下修改不会见促成报错。

  • PRAGMA cache_size; 
    PRAGMA cache_size = *
    Number-of-pages*;

    询问或修改SQLite一不好存储在内存中之数据库文件页数。每页使用约1.5K内存,缺省的缓存大小是2000。若得运用改变大量多行的UPDATE或DELETE命令,并且不在意SQLite使用更多之内存的话,可以叠加缓存以提高性。

    当使用cache_size
    pragma改变缓存大小时,改变就对时对话中,当数据库关闭重新打开时缓存大小恢复至缺省大小。要惦记永远改变缓存大小,使用default_cache_size pragma。

  • PRAGMA case_sensitive_like; 
    PRAGMA case_sensitive_like = *
    0 | 1*;

    LIKE运算符的缺省行为是忽略latin1字符的大大小小写。因此当缺乏省气象下‘a’
    LIKE ‘A’
    的价值吗确实。可以由此打开case_sensitive_like
    pragma来转这无异于欠省作为。当启用case_sensitive_like,‘a’ LIKE
    ‘A’
    为假而 ‘a’ LIKE ‘a’一如既往为确实。

  • PRAGMA count_changes; 
    PRAGMA count_changes = *
    0 | 1*;

    查询或改变count-changes标记。正常情况下INSERT,
    UPDATE和DELETE语句不回去数据。当打开count-changes,以上语句返回一行含一个整数值的数码——该语句插入、修改要删除的行数。返回的行数不包由触发器产生的插、修改或删除等反之行数。

  • PRAGMA default_cache_size; 
    PRAGMA default_cache_size = *
    Number-of-pages*;

    查询或改动SQLite一浅存储于内存中的数据库文件页数。每页使用约1.5K内存,它跟cache_sizepragma类似,只是她永久性地转移缓存大小。利用该pragma,你可以设定一不良缓存大小,并且每次又打开数据库时犹蝉联用该值。

  • PRAGMA default_synchronous;

    该语句以2.8版中可用,但每当3.0版本受吃失去丢了。这漫漫pragma很悬且非推荐用,安全由表现在该文档中莫干此pragma的用法。

  • PRAGMA empty_result_callbacks; 
    PRAGMA empty_result_callbacks = *
    0 | 1*;

    查询或重复改empty-result-callbacks标记。

    empty-result-callbacks标记就影响sqlite3_exec
    API函数。正常状态下,empty-result-callbacks标记清空,则指向回0行数据的授命不调用sqlite3_exec()的回叫函数,当装了empty-result-callbacks,则调用回叫
    函数一潮,置第三只参数为0(NULL)。这叫以sqlite3_exec()
    API的主次即使在同等漫长查询不返数据时还是检索字段名。

  • PRAGMA encoding; 
    PRAGMA encoding = “UTF-8”; 
    PRAGMA encoding = “UTF-16”; 
    PRAGMA encoding = “UTF-16le”; 
    PRAGMA encoding = “UTF-16be”;

    于首先种植形式中,若主数据库已经创造,这条pragma返回主数据库使用得文本编码格式,为“UTF-8”、“UTF-16le”(little-endian
    UTF-16 encoding)或者“UTF-16be”(big-endian UTF-16
    encoding)中之平等种。
    若主数据库未创建,返回值为当前对话创建的主数据库将要采用的文件编码格式。

    次种与其后几乎栽样式就在主数据库未创建时有效。这时该pragma设置当前对话创建的主数据库将要利用的文书编码格式。“UTF-16”表示“使用本机字节顺序的UTF-16编码”。若这些样式以主数据库创建后下,将给忽视且未生任何作用。

    数据库的编码格式设置后未可知为反。

    ATTACH命令创建的数据库使用及主数据库相同之编码格式。

  • PRAGMA full_column_names; 
    PRAGMA full_column_names = *
    0 | 1*;

    询问或更改the
    full-column-names标记。该标记影响SQLite命名SELECT语句(当字段表达式为表-字段或连配符”*”时)返回的许段名的法子。正常情形下,当SELECT语句以鲜独或多个说明连接时,这好像结果字段的回名吧,当SELECT语句询问一个独门的表时,返回字段名为。当装了full-column-names标记,返回的字段名将统一为
    不管是否对表进行了连接。

    若short-column-names和full-column-names标记同时叫设置,则应用full-column-names方式。

  • PRAGMA fullfsync 
    PRAGMA fullfsync = *
    0 | 1*;

    查询或更改fullfsync标记。该标记决定是否当支撑之系上使用F_FULLFSYNC同步模式。缺省值为off。截至目前(2006-02-10)只来Mac
    OS X系统支持F_FULLFSYNC。

  • PRAGMA page_size; 
    PRAGMA page_size = *
    bytes*;

    询问或设置page-size值。只有以不创建数据库时才会安装page-size。页面大小要是2之整数加倍且过等于512仅次于等于8192。上限可以透过在编译时修改宏定义SQLITE_MAX_PAGE_SIZE的价来改。上限的上限是32768。

  • PRAGMA read_uncommitted; 
    PRAGMA read_uncommitted = *
    0 | 1*;

    询问,设置或免除READ UNCOMMITTED
    isolation(读取未授权的分隔符)。缺省之SQLite分隔符等级是SERIALIZABLE。任何线程或进程而选用READ
    UNCOMMITTED
    isolation,但除了共享公共页和schema缓存的连接之间以外的地方为会见以SERIALIZABLE。缓存共享通过sqlite3_enable_shared_cache() API开启,且只有当运作同一线程的总是间行。缺省景象下缓存共享是倒闭的。

  • PRAGMA short_column_names; 
    PRAGMA short_column_names = *
    0 | 1*;

    查询或重新改the
    short-column-names标记。该标记影响SQLite命名SELECT语句(当字段表达式为表-字段或连配符”*”时)返回的许段名的点子。正常情况下,当SELECT语句以点滴只或多独说明连接时,这类似结果字段的归名也,当SELECT语句询问一个单身的表时,返回字段名也。当装了full-column-names标记,返回的字段名将统一啊无是否对表进行了连接。

    若short-column-names与full-column-names标记同时为装置,则使full-column-names方式。

  • PRAGMA synchronous; 
    PRAGMA synchronous = FULL; 
    (2) 
    PRAGMA synchronous = NORMAL; 
    (1) 
    PRAGMA synchronous = OFF; 
    (0)

    询问或改动“synchronous”标记的设定。第一栽样式(查询)返回整数值。
    当synchronous设置也FULL(2),SQLite数据库引擎在紧急时刻会中断为确定数据已勾勒副磁盘。这如果系统崩溃或电源出问题时常能确保数据库在重起后无见面坏。FULL
    synchronous很安全而挺缓慢。当synchronous设置为NORMAL,SQLite数据库引擎在多数紧迫时刻会搁浅,但无像FULL模式下那么累。NORMAL模式下产生不行有些之几带领(但不是休存在)发生电源故障导致数据库损坏的状。但实在,在这种状况下十分可能而的硬盘已经不能够使用,或者发了别样的不得恢复的硬件错误。设置为synchronous
    OFF(0)时,SQLite在传递数据给系统今后直接接轨要无间歇。若运行SQLite的应用程序崩溃,数据未会见伤,但每当网崩溃或写副数据时意外断电的动静下数据库可能会见坏。另一方面,在synchronous
    OFF时有的操作可能会见快50倍增甚至又多。

    在SQLite2中,缺省值为NORMAL,而在3备受修改也FULL。

  • PRAGMA temp_store; 
    PRAGMA temp_store = DEFAULT;
     (0) 
    PRAGMA temp_store = FILE;
     (1) 
    PRAGMA temp_store = MEMORY;
     (2)

    询问或改动“temp_store”参数的安。当temp_store设置为DEFAULT(0),使用编译时的C预处理宏TEMP_STORE来定义储存临时表和临时索引的职务。当装为MEMORY(2)临时表和目录存放于外存中。当装为FILE(1)则存放于文件中。temp_store_directory
    pragma可用于指定存放该公文之目。当改变temp_store设置,所有曾经存在的临时表、索引、触发器及视图将为立即删除。

    库房中之编译时C预处理标志TEMP_STORE可以挂该pragma设置。下面的表给出TEMP_STORE预处理宏和temp_store
    pragma交互作用的总结:

    TEMP_STORE PRAGMA
    temp_store
    临时表和索引
    使用的存储方式
    0 any 文件
    1 0 文件
    1 1 文件
    1 2 内存
    2 0 内存
    2 1 文件
    2 2 内存
    3 any 内存
  • PRAGMA temp_store_directory; 
    PRAGMA temp_store_directory = ‘directory-name’;

    查询或转移“temp_store_directory”设置——存储临时表和目录的文本所在的目录。仅以当下连日有效,在起新连时重置为缺乏省值。

    当改变了temp_store_directory设置,所有已有些临时表、索引、触发器、视图会被直删除。建议在数据库一打开时就设置好temp_store_directory。

    directory-name内需用单引号引起来。要惦记恢复缺乏省目录,把directory-name倘为空字符串。例如PRAGMA
    temp_store_directory =
    。若directory-name切莫找到或不足写会引发错误。

    临时文件的缺省目录及主机的系有关,使用Unix/Linux/OSX系统的主机,缺省目录是之类序列内第一单可写的/var/tmp、/usr/tmp、/tmp、current-directory。对于Windows
    NT,缺省目录由Windows决定,一般为C:/Documents and
    Settings/user-name/Local
    Settings/Temp/
    。SQLite创建的临时文件在以完毕时就是叫unlink,所以操作系统可以当SQLite进程展开中活动删除临时文件。于是,正常状态下不能够通过lsdir令看到临时文件。


用以查询数据库的schema的Pragma

  • PRAGMA database_list;

    对每个打开的数据库,使用该数据库的消息调用一坏回让函数。使用包括附加的数目库名和索引名在内的参数。第一实践用于主数据库,第二履用于存放临时表的旋数据库。

  • PRAGMA foreign_key_list(*table-name*);

    于参数表中每个涉及到字段的外键,使用该外键的信调用一潮回让函数。每个外键中的每个字段都拿调用一不良回给函数。

  • PRAGMA index_info(*index-name*);

    针对该索引涉及到之每个字段,使用字段信息(字段名、字段号)调用一蹩脚回给函数。

  • PRAGMA index_list(*table-name*);

    针对表中的每个索引,使用索引信息调用回叫函数。参数包括索引名和一个指示索引是否唯一的标志。

  • PRAGMA table_info(*table-name*);

    于表中的每个字段,使用字段信息(字段名、数据类型、可否为空、缺省值)调用回叫函数。


用来查询/更改版本信息的Pragma

  • PRAGMA [database.]schema_version; 
    PRAGMA [database.]schema_version = *
    integer 
    PRAGMA [database.]user_version; 
    PRAGMA [database.]user_version = 
    integer *;

    立刻半长pragma分别用于安装schema-version和user-version的值。schema-version和user-version均为32位来号整数,存放于数库头中。

    schema-version通常仅出于SQLite内部操作。每当数据库的Schema改变时(创建或者收回消表或索引),SQLite将之价值增大。Schema版本在各级一样坏Query被实践时被SQLite所使用,以确定编译SQL
    Query时中Cache的Schema与编译后底Query实际施行时数据库的Schema相匹配。使用“PRAGMA
    schema_version”更改schema-version会毁掉就无异于建制,有导致程序崩溃或数据库损坏的秘闻危险。请小心用!

    user-version不以SQLite内部采用,任何程序可以为此其来做任何事。


用于库Debug的Pragma

  • PRAGMA integrity_check;

    该令对一切数据库进行完整性检查,查找次序颠倒之笔录,丢失的页,残缺的记录与破坏的目。若发现另外问题虽然归一形容问题所在的字符串,若一切正常返回“ok”。

  • PRAGMA parser_trace = ON; (1) 
    PRAGMA parser_trace = OFF;
     (0)

    开辟或关闭SQLite库中之SQL语法分析追踪,用于Debug。只有当SQLite不行使NDEBUG宏进行编译时该pragma才可用。

  • PRAGMA vdbe_trace = ON; (1) 
    PRAGMA vdbe_trace = OFF;
     (0)

    开拓或关闭SQLite库中之杜撰数据库引擎追踪,用于Debug。更多信息,查看 VDBE文档。

  • PRAGMA vdbe_listing = ON; (1) 
    PRAGMA vdbe_listing = OFF;
     (0)

    打开或关闭虚拟机程序列表,当打开列表功能,整个程序的始末以尽前被打印出,就比如在每条语句之前自动执行EXPLAIN。语句以打印列表之后正常实施。用于Debug。更多信息,查看VDBE文档。

REINDEX

 

sql-statement ::= REINDEX collation name
sql-statement ::= REINDEX [database-name .] table/index-name

 

REINDEX命令用于去并由草稿重建索引。当于顺序改变时该令显得特别有效。

以第一种植样式被,所有附加数据库被行使该于顺序的目均让重建。在第二栽样式中,[database-name.]table/index-name标识出一个申明,所有涉嫌该表的目被重建。若标识出索引,则止该索引为剔除并重建。

要未点名database-name设指定表/索引名以及比较顺序,只有关联该于顺序的目被重建。在重建索引时连连指定database-name得免去这同样歧义。

REPLACE

 

sql-statement::= REPLACE INTO [database-name .] table-name [column-list )] VALUES (value-list ) |
REPLACE INTO 
[database-name .] table-name [column-list )] select-statement

 

REPLACE命令用于代替INSERT的“INSERT
OR
REPLACE”变体,以更好之兼容MySQL。查看INSERT命令文档获取更多信息。

SELECT

 

sql-statement ::= SELECT [ALL | DISTINCT] result [FROM table-list]
[WHERE expr]
[GROUP BY expr-list]
[HAVING expr]
[compound-op select]*
[ORDER BY sort-expr-list]
[LIMIT integer [( OFFSET | , ) integer]]
result ::= result-column [result-column]*
result-column ::= | table-name . * | expr [ [AS] string ]
table-list ::= table [join-op table join-args]*
table ::= table-name [AS alias] |
select ) [AS alias]
join-op ::= | [NATURAL] [LEFT | RIGHT | FULL] [OUTER | INNER | CROSS] JOIN
join-args ::= [ON expr] [USING ( id-list )]
sort-expr-list ::= expr [sort-order] [expr [sort-order]]*
sort-order ::= [ COLLATE collation-name ] [ ASC | DESC ]
compound_op ::= UNION | UNION ALL | INTERSECT | EXCEPT

 

SELECT语句用于查询数据库。一漫漫SELECT命令的归结果是心碎或者多尽每行有一定字段往往之数。字段的数由以SELECT和FROM之间的表达式列表定义。任意的表达式都得以让视作结果。若表达式是 *则表示所有表的有着字段。若表达式是说明的讳后接.*尽管如此结果吗该表中的有字段。

DISTINCT关键字之采用会要返回的结果是原结果的一个休分包相同行的子集。NULL值被认为是同等之。缺省作为是返回所有的履行,为解起见可以使主要字ALL。

查询对FROM之后定义之一个还是多独说明进行。若多个表用逗号连接,则查询针对她的交叉连接。所有的SQL-92连接语法均好用来定义连接。圆括号中的符合查询可能给FROM子句被之肆意表名替代。当结果负特发生一致实践包含表达式列表中之结果的新星,整个的FROM子句会受忽略。

WHERE子句可以限制查询操作的行数目。

GROUP
BY子词以一行要多推行结果合成单行输出。当结果发生集聚函数时就将进一步有因此。GROUP
BY子句的表达式不须凡出新在结果遭到之表达式。HAVING子句与WHERE相似,只是HAVING用于过滤分组创建的行。HAVING子句可能含有值,甚至是匪发生现在结果被之聚众函数。

ORDER
BY子句针对所得结果依据表达式排序。表达式无须是简简单单SELECT的结果,但于复合SELECT中每个表达式必须可靠对应一个结实字段。每个表达式可能跟一个可选的COLLATE关键字与用于排序文本的比函数名称及/或要字ASC或DESC,用于证明排序规则。

LIMIT子句子限定行数的极其深价值。负的LIMIT表示管上限。后以及可卜的OFFSET说明跳了结果集中之前面稍行。在一个复合查询中,LIMIT子词只允许出现于最终SELECT语句被。限定于持有的查询均适用,而不光是加加了LIMIT子词的那么一行。注意OFFSET关键字用于LIMIT子句被,则限制值是率先单数字,而偏移量(offset)是亚只数字。若用逗号替代OFFSET关键字,则偏移量是率先个数字要限制值是亚单数字。这是为着加强针对留的SQL数据库的配合而故意造成的龃龉。

复合的SELECT由少数只或另行多简单SELECT经由UNION、UNION
ALL、INTERSECT、EXCEPT中的一个运算符连接而改为。在一个复合SELECT中,各个SELECT需点名同个数的结果字段。仅允许一个ORDER
BY子词出现在SELECT的结尾。UNION和UNION
ALL运算符从漏洞百出至右将有SELECT的结果合成一个不行之阐发。二者的分别在于UNION的保有结果实施是未均等之假设UNION
ALL允许再行。INTERSECT运算符取左右零星只SELECT结果的交。EXCEPT从左SELECT的结果吃祛右边SELECT的结果。三个或再次多SELECT复合时,它们从错误至右结合。

UPDATE

 

sql-statement ::= UPDATE [ OR conflict-algorithm ] [database-name .] table-name
SET 
assignment [assignment]*
[WHERE expr]
assignment ::= column-name = expr

 

UPDATE语句用于转移表中所选行的配段值。每个UPDATE的赋值的顶号左边为字段名而右手为擅自表达式。表达式可以行使其他字段的值。所有的表达式将当赋值之前要出结果。可以用WHERE子句限定得改变的尽。

在应用就无异命令时,利用而选取的ON
CONFLICT子句可以定义替代的律冲突判定算法。更多信息,参见ON
CONFLICT。

VACUUM

 

sql-statement ::= VACUUM [index-or-table-name]

 

VACUUM命令是SQLite的一个恢弘功能,模仿PostgreSQL中之同一命令而来。若调用VACUUM带一个表名或索引名,则用整理该表或索引。在SQLite
1.0受到,VACUUM命令调用gdbm_reorganize()重整后端数据库文件。

SQLITE
2.0.0遭去丢了GDBM后端,VACUUM无效。在2.8.1版受,VACUUM被另行实现。现在索引名或表名被忽视。

当数据库中之一个靶(表、索引或触发器)被取消,会养空白的长空。它而数据库比待之大大小小更特别,但能够加速插入速度。实时的插入和去会使得数据库文件结构混乱,减慢对数据库内容看的进度。VACUUM命令复制主数据库文件及临时数据库并打即数据库重新载入主数据库,以整治数据库文件。这将除空白页,使表数据交互相邻排列,并整治数据库文件结构。不可知针对附加数据库文件进行上述操作。

倘若当前生运动工作,该令无法从作用。对于In-Memory数据库,该令无效。

SQLite
3.1饱受,可以经过利用auto-vacuum模式代表VACUUM命令,使用auto_vacuum
pragma开启该模式。

价值。负的LIMIT表示管上限。后以及可挑选的OFFSET说明跳了结果集中的前面有些行。在一个复合查询中,LIMIT子句只同意出现在最终SELECT语句被。限定于持有的询问均适用,而不只是互补加了LIMIT子句之那一行。注意OFFSET关键字用于LIMIT子句被,则限制值是率先只数字,而偏移量(offset)是亚独数字。若用逗号替代OFFSET关键字,则偏移量是率先单数字要限制值是亚只数字。这是为着提高针对遗留的SQL数据库的配合而故意造成的抵触。

复合的SELECT由少只或再次多简单SELECT经由UNION、UNION
ALL、INTERSECT、EXCEPT中之一个运算符连接而成为。在一个复合SELECT中,各个SELECT需点名同个数的结果字段。仅允许一个ORDER
BY子词出现在SELECT的尾声。UNION和UNION
ALL运算符从漏洞百出到右将有所SELECT的结果合成一个异常之阐明。二者的别在于UNION的备结果实施是无均等之要UNION
ALL允许再行。INTERSECT运算符取左右简单只SELECT结果的至。EXCEPT从左侧SELECT的结果遭到祛右边SELECT的结果。三个或又多SELECT复合时,它们于漏洞百出至右结合。

UPDATE

 

sql-statement ::= UPDATE [ OR conflict-algorithm ] [database-name .] table-name
SET 
assignment [assignment]*
[WHERE expr]
assignment ::= column-name = expr

 

UPDATE语句用于转移表中所选行的许段值。每个UPDATE的赋值的顶号左边为字段名而右侧为随意表达式。表达式可以使用任何字段的价。所有的表达式将当赋值之前要来结果。可以采用WHERE子句限定得改之履行。

以使用即时同下令时,利用而卜的ON
CONFLICT子句可以定义替代的自律冲突判定算法。更多信息,参见ON
CONFLICT。

VACUUM

 

sql-statement ::= VACUUM [index-or-table-name]

 

VACUUM命令是SQLite的一个恢宏功能,模仿PostgreSQL中的一致命令而来。若调用VACUUM带一个表名或索引名,则拿整治该表或索引。在SQLite
1.0遭遇,VACUUM命令调用gdbm_reorganize()整治后端数据库文件。

SQLITE
2.0.0遭失丢了GDBM后端,VACUUM无效。在2.8.1本备受,VACUUM被另行实现。现在索引名或表名被忽视。

当数据库中之一个目标(表、索引或触发器)被撤,会留下空白的空中。它而数据库比要的分寸更特别,但能加速插入速度。实时的插和去会使得数据库文件结构混乱,减慢对数据库内容看的速度。VACUUM命令复制主数据库文件及临时数据库并打即数据库重新载入主数据库,以整治数据库文件。这将除空白页,使表数据交互相邻排列,并整理数据库文件结构。不克对附加数据库文件进行以上操作。

使当前发移动工作,该令无法从作用。对于In-Memory数据库,该令无效。

SQLite
3.1着,可以经过下auto-vacuum模式代表VACUUM命令,使用auto_vacuum
pragma开启该模式。

网站地图xml地图