SQLite生成的列
SQLite生成列简介
SQLite从3.31.0版开始引入生成的列。
根据定义,生成的列是表中的列,其值是从涉及同一表中其他列的表达式派生的。
生成的列也称为计算列。
要定义生成的列,请使用生成的始终列约束语法,如下所示:
column_name data_type
[GENERATED ALWAYS] AS expression
[VIRTUAL | STORED]
在这种语法中,您可以指定一个表达式,该表达式在生成的ALWAYS关键字之后计算列名称的值。该表达式通常涉及同一表中同一行的列。
生成的ALWAYS关键字是可选的。因此,您可以按如下方式将其缩短:
column_name data_type AS expression [VIRTUAL | STORED]
生成的列可以是虚拟列,也可以是存储列。
如果生成的列是虚拟的,SQLite不会物理存储该列的值。相反,当您从生成的列中读取值时,SQLite会根据列声明中指定的表达式计算这些值。
如果存储了生成的列,SQLite将物理存储该列的值。换句话说,存储的生成列会占用数据库文件中的空间。当您写入数据库时,SQLite会更新存储的生成列的值。
当您没有在生成的列声明中显式指定VIRTUAL或storage时,SQLite默认使用VIRTUAL。
实际上,当您想要优化阅读时,可以使用存储选项,而当您想要优化写作时,可以使用虚拟选项。
SQLite生成的列示例
首先,使用以下create table语句创建一个名为products的表:
CREATE TABLE products(
name TEXT NOT NULL,
price REAL NOT NULL,
discount REAL NOT NULL,
tax REAL NOT NULL,
net_price REAL GENERATED ALWAYS
AS (price * (1-discount) * (1+tax))
);
在产品表中,净价是一个生成的列,其值来自价格、折扣和税列。
因为我们没有为净价列指定VIRTUAL或STORED,所以净价列默认使用VIRTUAL。
其次,在products表中插入新行。请注意,它不会向“净价”列提供值:
INSERT INTO products(name, price, discount, tax)
VALUES('ABC Widget',100, 0.05, 0.07);
第三,从products表中查询数据:
SELECT * FROM products;
结果:
name price discount tax net_price
---------- ---------- ---------- ---------- ----------
ABC Widget 100.0 0.05 0.07 101.65
从输出中可以清楚地看到,净价列的值是基于价格、折扣和税列的值计算的。
SQLite生成的列特征
生成的列具有以下功能:
SQLite对生成的列设置以下约束: