小。速度很快。可靠。
选择任意三个选项。
创建表格

1语法

创建table-stmt:

创建 临时雇员 临时 国际单项体育联合会 不是 存在 方案名称 . 表格名称 ( 列-参考 表格约束 , ) 表格选项 , AS公司 select-stmt(选择-测试)

列参考:

select-stmt(选择-测试):

表格约束:

表格选项:

2CREATE TABLE命令

“CREATE TABLE”命令用于在SQLite中创建新表数据库。CREATE TABLE命令指定新表:

每个CREATE TABLE语句都必须指定新表的名称。以“sqlite_”开头的表名保留供内部使用。尝试创建名称以开头的表时出错“sqlite_”。

如果方案名称如果指定了,则它必须是“main”,“temp”,或附加数据库在这种情况下新表是在命名数据库中创建的。如果“TEMP”或“TEMPORARY”关键字出现在“CREATE”和“TABLE”之间,则新表为在临时数据库中创建。如果同时指定架构名称和TEMP或TEMPORARY关键字,除非方案名称为“temp”。如果未指定架构名称,并且TEMP关键字不存在,则在主目录中创建表数据库。

尝试在数据库中创建一个新表通常是一个错误已经包含同名的表、索引或视图。然而,如果“IF NOT EXISTS”子句被指定为CREATE TABLE语句的一部分,并且已存在同名的表或视图,请使用CREATE table命令根本没有效果(并且没有返回错误消息)。错误仍然存在如果由于现有索引而无法创建表,则返回,即使如果指定了“if NOT EXISTS”子句。

创建与现有的触发.

使用DROP表格声明。

2.1.创建表格。。。AS SELECT语句

“CREATE TABLE…AS SELECT”语句创建并填充数据库表。这张桌子也一样SELECT语句返回的列数。的名称每个列与结果中相应列的名称相同SELECT语句的集合。确定每列的声明类型表达亲和力结果集中对应表达式的SELECT语句,如下所示:

表达式相关性列声明类型
文本“文本”
数字“数字”
整数“内景”
真实“真实的”
BLOB(也称为“无”)“”(空字符串)

使用CREATE table AS创建的表没有PRIMARY KEY,也没有任何类型的约束。每列的默认值为NULL。默认值新表中每列的排序规则序列是BINARY。

使用CREATE TABLE AS创建的表最初使用SELECT语句返回的数据行。连续分配行提升罗伊德值,从1开始,在秩序他们由SELECT语句返回。

三。列定义

除非它是CREATE TABLE。。。作为SELECT语句,CREATE TABLE包括一个或多个列定义,后跟一个列表(可选)表约束。每个列定义都包含列的名称,可以选择后跟列的声明类型,然后选择一个或多个列约束。包含在为前一个目的定义的“列约束”语句是COLLATE和DEFAULT子句,尽管它们实际上不是约束,即它们不限制表可能包含。其他约束-NOT NULL、CHECK、UNIQUE、PRIMARY KEY和FOREIGN KEY约束-对表数据施加限制。

表中的列数受SQLITE_MAX_COLUMN数据库编译时参数。表的单行不能存储超过SQLITE_MAX_长度字节的数据。这两个限制都可以降低运行时使用sqlite3_limit()C/C++接口。

3.1.列数据类型

与大多数SQL数据库不同,SQLite不限制可以基于声明类型的列插入到列中。相反,SQLite使用动态键入。列的声明类型用于确定密切关系仅限列的。

3.2.DEFAULT子句

如果没有,DEFAULT子句指定要用于列的默认值值由用户在执行插入.如果有没有显式DEFAULT子句附加到列定义,则该列的默认值为NULL。显式DEFAULT子句可以指定默认值为NULL、字符串常量、blob常量、带符号的数字,或括在括号中的任何常量表达式。A类默认值也可以是一个特殊的case-independent关键字例如CURRENT_TIME、CURRENT_DATE或CURRENT_TIMESTAMP。为了DEFAULT子句中,如果表达式不包含子查询、列或表引用,绑定参数,或者用双引号而不是单引号括起来的字符串文字。

每次通过INSERT语句将行插入到表中时不为存储值的所有表列提供显式值新行由其默认值确定,如下所示:

3.3.COLLATE子句

COLLATE子句指定排序序列用作列的默认排序规则序列。如果没有COLLATE子句指定时,默认排序规则序列为二元的.

3.4.GENERATED ALWAYS AS子句

包含GENERATED ALWAYS AS子句的列是生成的列.从SQLite版本3.31.0(2020-01-22)开始,支持生成的列。请参阅单独的文档有关功能和生成列的限制。

3.5.主钥匙

SQLite中的每个表最多只能有一个PRIMARY KEY。如果关键字PRIMARY KEY被添加到列定义中,然后主键因为表由那一列组成。或者,如果是PRIMARY KEY子句被指定为表格约束,然后是表的主键由作为PRIMARY KEY子句一部分指定的列列表组成。PRIMARY KEY子句只能包含列名-使用表达式索引列不支持主键的。如果在CREATE TABLE语句。对于普通表,PRIMARY KEY是可选的但对于不带ROWID桌子。

如果一个表有一个单列主键,并且该主键的声明类型为列为“INTEGER”,表不是不带ROWID表,则该列称为集成主键.请参见在下面用于描述特殊属性和行为集成主键.

具有主键的表中的每一行必须具有唯一的组合其主键列中的值。为了确定主键值的唯一性,NULL值被认为与所有其他值,包括其他NULL。如果插入更新语句尝试修改表内容,以便两行或更多行具有相同的主键值,即违反了约束。

根据SQL标准,PRIMARY KEY应始终表示NOT NULL。不幸的是,由于一些早期版本中的错误,这不是以SQLite为例。除非列是整数主键这张桌子是不带ROWID表或严格或该列声明为NOT NULL,SQLite允许在PRIMARY KEY列中使用NULL值。SQLite可以固定到符合标准,但这样做可能会破坏遗留应用程序。因此,决定只记录SQLite在大多数PRIMARY KEY列中允许NULL。

3.6.UNIQUE约束

UNIQUE约束类似于PRIMARY KEY约束,不同之处在于单个表可以有任意数量的UNIQUE约束。对于每个表上的UNIQUE约束,每行必须包含唯一的组合由UNIQUE约束标识的列中的值。对于UNIQUE约束,NULL值被视为不同于所有其他值,包括其他NULL。与主钥匙一样,独一无二表格约束子句必须包含仅列名称-使用表达式索引列独一无二的表格约束不支持。

在大多数情况下,唯一键和主键约束是通过在数据库中创建唯一索引来实现的。(例外情况如下集成主键和主键打开不带ROWID表。)因此,以下模式在逻辑上是等价的:

  1. 创建表t1(a,b唯一);

  2. 创建表t1(a,b主键);

  3. 创建表t1(a,b);
    在t1(b)上创建唯一索引t1b;

3.7.CHECK约束

CHECK约束可以附加到列定义或指定为表约束。实际上,这没有什么区别。每个将新行插入表或更新现有行时,计算与每个CHECK约束关联的表达式,并转换为NUMERIC值的方法与CAST表达式。如果结果为零(整数值0或实值0.0),然后是约束发生了违规行为。如果CHECK表达式的计算结果为NULL,或任何其他非零值,都不违反约束。CHECK约束的表达式不能包含子查询。

CHECK约束仅在写入表时验证,而不是在它已被阅读。此外,CHECK约束的验证可以是使用“PRAGMA ignore_check_constraints=ON;"声明。因此,查询可能会产生以下结果违反CHECK约束。

3.8.NOT NULL约束

NOT NULL约束只能附加到列定义,未指定为表约束。毫不奇怪,Not NULL约束规定关联的列不能包含NULL值。插入新行或时尝试将列值设置为NULL更新现有的约束会导致违反约束。非空查询期间不会验证约束,因此对列的查询可能即使列标记为NOT NULL,如果数据库文件已损坏。

4强制执行约束

约束在插入更新PRAGMA完整性检查PRAGMA快速检查有时通过ALTER表格.查询和删除语句通常不验证约束。因此,如果数据库文件已损坏(可能由外部直接更改数据库文件的程序SQLite库)查询可能会返回违反约束的数据。例如:

创建表t1(x INT CHECK(x>3));/*通过直接写入**使用外部程序的数据库文件*/PRAGMA完整性检查;--将x小于3的行报告为损坏插入t1(x)值(2);--SQLITE_CORRUPT失败从t1中选择x;--尽管存在CHECK约束,但返回小于3的整数

可以使用临时禁用CHECK约束的实施这个PRAGMA ignore_check_constraints=ON;声明。

4.1.违反约束的响应

约束冲突的响应由约束冲突消解算法.每个PRIMARY KEY、UNIQUE、NOT NULL和CHECK约束存在默认冲突分辨率算法。PRIMARY KEY、UNIQUE和NOT NULL约束可以是通过显式分配另一个默认冲突解决算法包括一个冲突条款在他们的定义中。或者,如果约束定义不包含冲突条款,默认的冲突解决算法是ABORT。CHECK约束的冲突解决算法总是ABORT。(仅为历史兼容性,允许使用表CHECK约束有一个冲突解决条款,但这没有效果。)内部的不同约束同一个表可能有不同的默认冲突解决算法。请参见标题为的部分论冲突了解更多信息。

5ROWID和整数主键

除了不带ROWID表,SQLite表中的所有行有一个64位有符号整数键,用于唯一标识表中的行。此整数通常为称为“rowid”。rowid值可以使用一个特殊的case-independent用“rowid”、“oid”或“rowidd”代替列名。如果表包含名为“rowid”、“oid”或“_rowid_”的用户定义列,则该名称总是引用显式声明的列,并且不能使用检索整数rowid值。

在中省略了rowid(以及“oid”和“_rowid_”)不带ROWID桌子。WITH OUT ROWID表格仅在SQLite中可用版本3.8.2(2013-12-06)及更高版本。缺少WITHOUT ROWID子句的表称为“ROWID表”。

rowid表的数据存储为B-Tree结构,其中包含每个表行一个条目,使用rowid值作为键。这意味着通过rowid检索或排序记录很快。使用搜索记录特定的rowid,或者对于rowid在指定范围内的所有记录大约是通过指定任何其他PRIMARY进行的类似搜索的两倍KEY或索引值。

除了下面提到的一个例外,如果rowid表的主键包含并且该列的声明类型在以下任意组合中为“INTEGER”大小写,则该列成为rowid的别名。这样一个列通常被称为“整数主键”。PRIMARY KEY列仅当声明的类型名称正好是“整数”。其他整数类型名称,如“INT”、“BIGINT”或“SHORT integer”或“UNSIGNED INTEGER”会导致主键列表现为普通带整数的表列密切关系和唯一索引,而不是作为的别名吵闹的人。

上面提到的例外是,如果声明的类型“INTEGER”包含“PRIMARY KEY DESC”子句,但它不包含成为rowid的别名,并且不被归类为整数主键。这种怪癖不是故意的。这是由于SQLite早期版本中的一个错误造成的。但修复该错误可能会导致向后不兼容。因此,原始行为被保留(并记录在案),因为奇怪角落案例中的行为远比兼容性中断好。这意味着以下三个表声明都会导致列“x”为rowid的别名(整数主键):

但以下声明不会导致“x”成为的别名rowid:

Rowid值可以使用相同的UPDATE语句进行修改与任何其他列值一样,可以使用其中一个内置别名(“rowid”、“oid”或“_rowid_”)或使用由整数创建的别名主键。类似地,INSERT语句可以提供一个值,用作插入的每一行的rowid。与普通SQLite列不同,整数主列键或rowid列必须包含整数值。整数主键或rowid列无法保存浮点值、字符串、BLOB或NULL。

如果UPDATE语句试图设置整数主键或rowid列为NULL或blob值,或为不能无损的字符串或实值转换为整数时,会发生“数据类型不匹配”错误,语句已中止。如果INSERT语句试图插入blob值或字符串或无法无损地转换为整数的实数整数主键或rowid列,则会发生“数据类型不匹配”错误,并且语句被中止。

如果INSERT语句试图将NULL值插入到rowid或整数主键列,则系统选择一个整数值作为rowid自动显示。提供了如何完成此操作的详细描述分别地.

这个父关键字外键约束不允许使用rowid。父键只能使用命名列。

此页面上次修改时间2024-03-13 17:43:35联合技术公司