SQLite的SQL语法详解(2)

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

每个字段的定义是字段名后跟字段的数据类型,接着是一个或多个的字段约束。字段的数据类型并不限制字段中可以存放的数据。可以查看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语句。

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/608914114f851c1673b5401a61aa0f05.html