SQLite的SQL语法1

上传人:飞*** 文档编号:4828277 上传时间:2017-08-26 格式:DOCX 页数:24 大小:45.06KB
返回 下载 相关 举报
SQLite的SQL语法1_第1页
第1页 / 共24页
SQLite的SQL语法1_第2页
第2页 / 共24页
SQLite的SQL语法1_第3页
第3页 / 共24页
SQLite的SQL语法1_第4页
第4页 / 共24页
SQLite的SQL语法1_第5页
第5页 / 共24页
点击查看更多>>
资源描述

《SQLite的SQL语法1》由会员分享,可在线阅读,更多相关《SQLite的SQL语法1(24页珍藏版)》请在金锄头文库上搜索。

1、ALTER TABLE := := := SQLite 版本的的 ALTER TABLE 命令允许用户重命名或添加新的字段到已有表中,不能从表中删除字段。 RENAME TO 语法用于重命名表名 database-name.table-name 到 new-table-name。这一命令不能用于在附加数据库之间移动表,只能在同一个数据库中对表进行重命名。若需要重命名的表有触发器或索引,在重命名后它们依然属于该表。但若定义了视图,或触发器执行的语句中有提到 表的名字,则它们不会被自动改为使用新的表名。若要进行这一类的修改,则需手工撤销并使用新的表名重建触发器或视图。ADD COLUMN语法用于在

2、已有表中添加新的字段。新字段总是添加到已有字段列表的末尾。 Column-def 可以是 CREATE TABLE 中允许出现的任何形式,且须符合如下限制: 字段不能有主键或唯一约束。 字段不能有这些缺省值:CURRENT_TIME, CURRENT_DATE 或CURRENT_TIMESTAMP 若定义了 NOT NULL 约束,则字段必须有一个非空的缺省值。 ALTER TABLE 语句的执行时间与表中的数据量无关,它在操作一个有一千万行的表时的运行时间与操作仅有一行的表时是一样的。 在对数据库运行 ADD COLUMN 之后,该数据库将无法由 SQLite 3.1.3 及更早版本读取,除

3、非运行 VACUUM 命令。ANALYZE := := := ANALYZE 命令令集合关于索引的统计信息并将它们储存在数据库的一个特殊表中,查询优化器可以用该表来制作更好的索引选择。 若不给出参数,所有附加数据库中的所有索引被分析。若参数给出数据库名,该数据库中的所有索引被分析。若给出表名 作参数,则只有关联该表的索引被分析。最初的实现将所有的统计信息储存在一个名叫 sqlite_stat1 的表中。未来的加强版本中可能会创建名字类似的其它表, 只是把1改为其它数字。sqlite_stat1 表不能够被,但其中的所有内容可以被,这是与撤销该表等效的行为。ATTACH DATABASE ATT

4、ACH DATABASE 语句将一个已存在的数据库添加到当前数据库连接。若文件名含标点符号,则应用引号引起来。 数据库名main和temp代表主数据库和用于存放临时表的数据库,它们不能被拆分。拆分数据库使用 语句。你可以读写附加数据库,或改变其结构。这是 SQLite3.0 提供的新特性。在SQLite 2.8 中,改变附加数据库的结构是不允许的。在附加数据库中添加一个与已有表同名的表是不允许的。但你可以附加带有与主数据库中的表同名的表的数据库。也可以多次附加同一数据库。使用 database-name.table-name 来引用附加数据库中的表。若附加数据库中的表与主数据库的表不重名,则不

5、需加数据库名作为前缀。当数据库被附加时,它的所有不重名的表成为该名字指向的缺省表。之后附加的任意与之同名的表需要加前缀。若“缺省”表被拆分, 则最后附加的同名表变为“缺省”表。若主数据库不是:memory:,多附加数据库的事务是原子的。若主数据库是:memory:则事务在每个独立文件中依然是原子的。 但若主机在改变两个或更多数据库的 COMMIT 语句进行时崩溃,则可能一部分文件被改变而其他的保持原样。附加数据库的原子性的提交 是 SQLite 3.0 的新特性。在 SQLite 2.8 中,所有附加数据库的提交类似于主数据库是:memory:时的情况。对附加数据库的数目有编译时的限制,最多

6、10 个附加数据库。BEGIN TRANSACTION := | := := := 从 2.0 版开始,SQLite 支持带有回退和原子性的提交的事务处理。可选的事务名称会被忽略。SQLite 目前不允许嵌套事务。在事务之外,不能对数据库进行更改。如果当前没有有效的事务,任何修改数据库的命令(基本上除了 SELECT 以外的所有 SQL 命令)会自动启动一个事务。命令结束时,自动启动的事务会被提交。 可以使用 BEGIN 命令手动启动事务。这样启动的事务会在下一条 COMMIT 或ROLLBACK 命令之前一直有效。但若数据库关闭 或出现错误且选用 ROLLBACK 冲突判定算法时,数据库也会

7、 ROLLBACK。查看子句 获取更多关于 ROLLBACK 冲突判定算法的信息。 在 SQLite 3.0.8 或更高版本中,事务可以是延迟的,即时的或者独占的。“延迟的”即是说在数据库第一次被访问之前不获得锁。 这样就会延迟事务,BEGIN 语句本身不做任何事情。直到初次读取或访问数据库时才获取锁。对数据库的初次读取创建一个 SHARED 锁 ,初次写入创建一个 RESERVED 锁。由于锁的获取被延迟到第一次需要时,别的线程或进程可以在当前线程执行 BEGIN 语句之后创建另外的事务 写入数据库。若事务是即时的,则执行 BEGIN 命令后立即获取 RESERVED 锁,而不等数据库被使用

8、。在执行 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 或更早版本中,所

9、有的事务 都是独占的。 COMMIT 命令在所有 SQL 命令完成之前并不作实际的提交工作。这样若两个或更多个 SELECT 语句在进程中间而执行 COMMIT 时,只有全部 SELECT 语句结束才进行提交。执行 COMMIT 可能会返回 SQLITE_BUSY 错误代码。这就是说有另外一个线程或进程获取了数据库的读取锁,并阻止数据库被改变。当 COMMIT 获得该错误代码时,事务依然是活动的,并且在 COMMIT 可以在当前读取的线程读取结束后再次试图读取数据库。END TRANSACTION := | := := := 从 2.0 版开始,SQLite 支持带有回退和原子性的提交的事务处

10、理。可选的事务名称会被忽略。SQLite 目前不允许嵌套事务。在事务之外,不能对数据库进行更改。如果当前没有有效的事务,任何修改数据库的命令(基本上除了 SELECT 以外的所有 SQL 命令)会自动启动一个事务。命令结束时,自动启动的事务会被提交。 可以使用 BEGIN 命令手动启动事务。这样启动的事务会在下一条 COMMIT 或ROLLBACK 命令之前一直有效。但若数据库关闭或出现错误且选用 ROLLBACK 冲突判定算法时,数据库也会 ROLLBACK。查看子句获取更多关于 ROLLBACK 冲突判定算法的信息。 在 SQLite 3.0.8 或更高版本中,事务可以是延迟的,即时的或者

11、独占的。“延迟的”即是说在数据库第一次被访问之前不获得锁。这样就会延迟事务,BEGIN语句本身不做任何事情。直到初次读取或访问数据库时才获取锁。对数据库的初次读取创建一个 SHARED 锁,初次写入创建一个 RESERVED 锁。由于锁的获取被延迟到第一次需要时,别的线程或进程可以在当前线程执行 BEGIN 语句之后创建另外的事务写入数据库。若事务是即时的,则执行 BEGIN 命令后立即获取RESERVED 锁,而不等数据库被使用。在执行 BEGIN IMMEDIATE 之后,你可以确保其它的线程或进程不能写入数据库或执行 BEGIN IMMEDIATE 或 BEGIN EXCLUSIVE.

12、但其它进程可以读取数据库。独占事务在所有的数据库获取EXCLUSIVE 锁,在执行 BEGIN EXCLUSIVE 之后,你可以确保在当前事务结束前没有任何其它线程或进程能够读写数据库。有关 SHARED, RESERVED, 和 EXCLUSIVE 锁可以参见。 SQLite 3.0.8 的默认行为是创建延迟事务。SQLite 3.0.0 到 3.0.7 中延迟事务是唯一可用的事务类型。SQLite 2.8 或更早版本中,所有的事务都是独占的。COMMIT 命令在所有 SQL 命令完成之前并不作实际的提交工作。这样若两个或更多个 SELECT 语句在进程中间而执行 COMMIT 时,只有全部

13、 SELECT 语句结束才进行提交。执行 COMMIT 可能会返回 SQLITE_BUSY 错误代码。这就是说有另外一个线程或进程获取了数据库的读取锁,并阻止数据库被改变。当 COMMIT 获得该错误代码时,事务依然是活动的,并且在 COMMIT 可以在当前读取的线程读取结束后再次试图读取数据库。 注释 := | := := 注释不是 SQL 命令,但会出现在 SQL 查询中。它们被解释器处理为空白部分。它们可以在任何空白可能存在的地方开始 ,即使是在跨越多行的表达式中。SQL 风格的注释仅对当前行有效。C 风格的注释可以跨越多行。若没有结束符号,注释的范围将一直延伸到输入末尾,且不会引起报错

14、。 新的 SQL 语句可以从多行注释结束的地方开始。C 风格注释可以嵌入任何空白可以出现的地方,包括表达式内,或其他 SQL 语句中间, 并且 C 风格的注释不互相嵌套。SQL 风格的注释出现在 C 风格注释中时将被忽略。 COPY := COPY 命令在 SQLite 2.8 及更早的版本中可用。SQLite 3.0 删除了这一命令,因为在混合的 UTF-8/16 环境中对它进行支持是很复杂的。 在 3.0 版本中,包含新的.import 命令,用以替代 COPY。 COPY 命令是用于将大量数据插入表的一个插件。它模仿 PostgreSQL 中的相同命令而来。事实上,SQLite 的 CO

15、PY 命令就是为了能够读取 PostgreSQL 的备份工具 pg_dump 的输出从而能够将 PostgreSQL 的数据轻松转换到 SQLite 中而设计的。table-name 是将要导入数据的一个已存在的表的名字。filename 是一个字符串或标识符,用于说明作为数据来源的文件。 filename 可以使用 STDIN 从标准输入流中获取数据。输入文件的每一行被转换成一条单独的记录导入表中。字段用制表符分开。若某个字段的数据中出现制表符, 则前面被添加反斜线符号。数据中的反斜线则被替换为两条反斜线。可选的 USING DELIMITERS 子句可给出一个与制表符不同 的分界符。若字段

16、由N组成,则被赋以空值 NULL.使用这一命令时,利用可选的 ON CONFLICT 子句可以定义替代的约束冲突判定算法。更多信息,参见 。当输入数据源是 STDIN,输入将终止于一行仅包含一个反斜线和一个点的输入: .CREATE INDEX := * := | CREATE INDEX 命令由CREATE INDEX关键字后跟新索引的名字,关键字ON,待索引表的名字,以及括弧内的用于索引键的字段列表构成。每个字段名可以跟随ASC或DESC关键字说明排序法则,但在当前版本中排序法则被忽略。排序总是按照上升序。每个字段名后跟 COLLATE 子句定义文本记录的比较顺序。缺省的比较顺序是由CREATE TABLE 语句说明的比较顺序。 若不定义比较顺序,则使用内建的二进制比较顺序。附加到

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 行业资料 > 其它行业文档

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号