Skip to main content

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对生成的列设置以下约束:

总结