1 语法
创建table-stmt:
隐藏
创建
临时雇员
临时
表
国际单项体育联合会
不是
存在
方案名称
.
表格名称
(
列-参考
表格约束
,
)
表格选项
,
AS公司
select-stmt(选择-测试)
列参考:
显示
列约束:
显示
约束
名称
主要
钥匙
DESC公司
冲突条款
自动更正
ASC公司
不是
无效的
冲突条款
独特
冲突条款
检查
(
快递
)
违约
(
快递
)
文字值
签名号码
COLLATE公司
排序规则名称
外国关键词
生成
始终
AS公司
(
经验
)
事实上的
存储
冲突条款:
显示
快递:
显示
文字值
绑定参数
方案名称
.
表格名称
.
列名
一元运算符
快递
经验
二进制运算符
快递
函数-名称
(
函数参数
)
过滤子句
附加条款
(
快递
)
,
铸件
(
快递
AS公司
类型名称
)
快递
COLLATE公司
排序规则名称
快递
不是
喜欢
GLOB公司
REGEXP公司
匹配
快递
快递
逃生
快递
快递
ISNULL(ISNULL)
不为空
不是
无效的
经验
是
不是
与众不同
发件人
快递
快递
不是
协议双方:
经验
和
快递
快递
不是
英寸
(
select-stmt(选择-测试)
)
快递
,
方案名称
.
表格功能
(
快递
)
表格名称
,
不是
存在
(
select-stmt(选择-测试)
)
案例
快递
什么时候
快递
然后
快递
ELSE公司
快递
结束
raise函数
过滤条款:
显示
函数参数:
显示
订购术语:
显示
快递
COLLATE公司
排序规则名称
DESC公司
ASC公司
空
第一
空
最后
超额条款:
显示
超过
窗口名称
(
基本翼名称
隔板
由
经验
,
订单
由
订购术语
,
特定帧
)
特定帧:
显示
组
协议双方:
无约束
之前
和
无边界的
以下
范围
排
无约束
之前
快递
之前
当前
世界其他地区
快递
之前
当前
世界其他地区
快递
以下
快递
之前
当前
世界其他地区
快递
以下
排除
当前
世界其他地区
排除
集团
排除
领带
排除
不
其他
订购术语:
显示
快递
COLLATE公司
排序规则名称
DESC公司
ASC公司
空
第一
空
最后
raise函数:
显示
RAISE(升起)
(
回降
,
错误消息
)
IGNORE公司
中止
失败
外国关键词:
显示
参考文献
外国餐桌
(
列名
)
,
打开
删除
SET(设置)
无效的
更新
SET(设置)
违约
级联
限制
不
行动
匹配
名称
不是
可延期
最初
推迟
最初
立即
文字值:
显示
当前时间戳
数字-文字
串文字
blob-literal(blob-文字)
无效的
真的
错误的
当前时间(_T)
当前日期(_D)
签名号码:
显示
类型名称:
显示
名称
(
签名号码
,
签名号码
)
(
签名号码
)
签名号码:
显示
select-stmt(选择-测试):
显示
与
递归
通用表格表达
,
选择
与众不同
结果栏
,
所有
发件人
表或子查询
连词
,
哪里
快递
集团
由
快递
有
快递
,
窗户
窗口名称
AS公司
窗-深
,
值
(
快递
)
,
,
复合运算符
选择-核心
订单
由
极限
快递
订购术语
,
抵消
快递
,
快递
通用表格表达:
显示
表格名称
(
列名
)
AS公司
不是
材料化
(
select-stmt(选择-测试)
)
,
复合运算符:
显示
快递:
显示
文字值
绑定参数
方案名称
.
表格名称
.
列名
一元运算符
快递
快递
二进制运算符
快递
函数名称
(
函数参数
)
过滤子句
附加条款
(
快递
)
,
铸件
(
快递
AS公司
类型名称
)
快递
COLLATE公司
排序规则名称
快递
不是
喜欢
GLOB公司
REGEXP公司
匹配
快递
快递
逃生
快递
快递
ISNULL(ISNULL)
不为空
不是
无效的
快递
是
不是
与众不同
发件人
快递
快递
不是
协议双方:
快递
和
快递
快递
不是
英寸
(
select-stmt(选择-测试)
)
快递
,
方案名称
.
表格功能
(
经验
)
表格名称
,
不是
存在
(
select-stmt(选择-测试)
)
案例
快递
什么时候
经验
然后
快递
ELSE公司
快递
结束
raise函数
过滤条款:
显示
函数参数:
显示
文字值:
显示
当前时间戳
数字-文字
串文字
blob-literal(blob-文字)
无效的
真的
错误的
当前时间(_T)
当前日期(_D)
附加条款:
显示
超过
窗口名称
(
基本翼名称
隔板
由
快递
,
订单
由
订购术语
,
特定帧
)
特定帧:
显示
组
双方
无约束
之前
和
无约束
以下
范围
行
无约束
之前
快递
之前
当前
世界其他地区
快递
之前
电流,电流
世界其他地区
快递
以下
快递
之前
当前
世界其他地区
快递
以下
排除
当前
世界其他地区
排除
集团
排除
领带
排除
不
其他
raise函数:
显示
RAISE(升起)
(
回降
,
错误消息
)
IGNORE公司
中止
失败
类型名称:
显示
名称
(
签名号码
,
签名号码
)
(
签名号码
)
签名号码:
显示
联合条款:
显示
订购期限:
显示
快递
COLLATE公司
排序规则名称
DESC公司
ASC公司
空
第一
空
最后
结果列:
显示
表或子查询:
显示
方案名称
.
表格名称
AS公司
桌上躺椅
索引
由
索引名称
不是
索引
表格-功能-名称
(
快递
)
,
AS公司
桌上躺椅
(
select-stmt(选择-测试)
)
(
表或子查询
)
,
连词
窗口定义:
显示
(
基本翼名称
隔板
由
快递
,
订单
由
订货条件
,
特定帧
)
特定帧:
显示
组
协议双方:
无约束
之前
和
无约束
以下
范围
行
无约束
之前
快递
之前
当前
世界其他地区
快递
之前
当前
世界其他地区
快递
以下
快递
之前
当前
世界其他地区
快递
以下
排除
当前
世界其他地区
排除
集团
排除
领带
排除
不
其他
表格约束:
显示
约束
名称
主要
钥匙
(
索引列
)
冲突条款
,
独特
检查
(
经验
)
国外
钥匙
(
列名
)
外国关键词
,
冲突条款:
显示
打开
冲突
回降
中止
失败
IGNORE公司
更换
快递:
显示
文字值
绑定参数
方案名称
.
表格名称
.
列名
一元运算符
快递
快递
二进制运算符
快递
函数-名称
(
函数参数
)
过滤子句
附加条款
(
快递
)
,
铸件
(
快递
AS公司
类型名称
)
快递
COLLATE公司
排序规则名称
快递
不是
喜欢
GLOB公司
REGEXP公司
匹配
快递
经验
逃生
快递
快递
ISNULL(ISNULL)
不为空
不是
无效的
快递
是
不是
与众不同
发件人
快递
快递
不是
协议双方:
快递
和
快递
快递
不是
英寸
(
选择stmt
)
快递
,
方案名称
.
表格功能
(
快递
)
表格名称
,
不是
存在
(
select-stmt(选择-测试)
)
案例
快递
什么时候
快递
然后
快递
ELSE公司
快递
结束
raise函数
过滤条款:
显示
函数参数:
显示
订购术语:
显示
经验
COLLATE公司
排序规则名称
DESC公司
ASC公司
空
第一
零点
最后
文字值:
显示
当前时间戳
数字-文字
串文字
blob-literal(blob-文字)
无效的
真的
错误的
当前时间(_T)
当前日期(_D)
超额条款:
显示
超过
窗口名称
(
基本翼名称
隔板
由
快递
,
订单
由
订购术语
,
特定帧
)
特定帧:
显示
组
协议双方:
无约束
之前
和
无约束
以下
范围
排
无约束
之前
快递
之前
当前
世界其他地区
快递
在前
当前
世界其他地区
快递
以下
快递
在前
当前
世界其他地区
快递
以下
排除
当前
世界其他地区
排除
集团
排除
领带
排除
不
其他
订购术语:
显示
快递
COLLATE公司
排序规则名称
DESC公司
ASC公司
空
第一
空
最后
raise函数:
显示
RAISE(升起)
(
回降
,
错误消息
)
IGNORE公司
中止
失败
类型名称:
显示
名称
(
签名号码
,
签名号码
)
(
签名号码
)
签名号码:
显示
外国关键词:
显示
参考文献
外国餐桌
(
列名
)
,
打开
删除
SET(设置)
无效的
更新
SET(设置)
违约
级联
限制
不
行动
匹配
名称
不是
可延期的
最初
推迟
最初
立即
索引列:
显示
列名
COLLATE公司
排序规则名称
DESC公司
快递
ASC公司
表格选项:
显示
2 CREATE 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语句将行插入到表中时 不为存储值的所有表列提供显式值 新行由其默认值确定,如下所示:
如果列的默认值是常量NULL、文本、blob或 signed-number值,然后在新行中直接使用该值。
如果列的默认值是括号中的表达式,则 对于插入的每一行和结果,表达式求值一次 在新行中使用。
如果列的默认值为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”。
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 表。) 因此,以下模式在逻辑上是等价的:
创建表t1(a,b唯一);
创建表t1(a,b主键);
创建表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约束 有一个冲突解决条款,但这没有效果。) 内部的不同约束 同一个表可能有不同的默认冲突解决算法。 请参见 标题为的部分 论冲突 了解更多信息。
5 ROWID和整数主键
除了 不带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的别名(整数主键):
创建表t(x整数主键ASC,y,z);
创建表t(x整数,y,z,主键(x ASC));
创建表t(x整数,y,z,主键(x DESC));
但以下声明不会导致“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 联合技术公司