如何使用MySQL生成的列
简介:在本教程中,您将学习如何使用MySQL生成的列来存储从表达式或其他列计算出的数据。
MySQL生成列简介
创建新表时,可以在CREATE TABLE语句中指定表列。
然后,您使用INSERT,UPDATE和DELETE语句直接修改表列中的数据。
MySQL 5.7引入了一项称为生成的列的新功能。
生成列是因为这些列中的数据是基于预定义表达式计算的。
例如,您具有以下结构的联系人:
DROP TABLE IF EXISTS contacts; CREATE TABLE contacts ( id INT AUTO_INCREMENT PRIMARY KEY, first_name VARCHAR(50) NOT NULL, last_name VARCHAR(50) NOT NULL, email VARCHAR(100) NOT NULL );
要获取联系人的全名,请使用CONCAT()函数,如下所示:
SELECT id, CONCAT(first_name, ' ', last_name), email FROM contacts;
这不是最漂亮的查询。
通过使用MySQL生成的列,您可以按以下方式重新创建联系人表:
DROP TABLE IF EXISTS contacts; CREATE TABLE contacts ( id INT AUTO_INCREMENT PRIMARY KEY, first_name VARCHAR(50) NOT NULL, last_name VARCHAR(50) NOT NULL, fullname varchar(101) GENERATED ALWAYS AS (CONCAT(first_name,' ',last_name)), email VARCHAR(100) NOT NULL );
GENERATED ALWAYS as(expression)是用于创建生成的列的语法。
要测试全名列,请在通讯录中插入一行。
INSERT INTO contacts(first_name,last_name, email) VALUES('john','doe','[email protected]');
现在,您可以从联系人表中查询数据。
SELECT * FROM contacts;
当您从通讯录中查询数据时,全名列中的值会即时计算出来。
MySQL提供了两种类型的生成列:存储列和虚拟列。
每次读取数据时都会动态计算虚拟列,而在更新数据时将计算并物理存储存储的列。
根据此定义,上例中的全名列是虚拟列。
MySQL产生栏的语法
定义生成的列的语法如下:
column_name data_type [GENERATED ALWAYS] AS (expression) [VIRTUAL | STORED] [UNIQUE [KEY]]
首先,指定列名称及其数据类型。
接下来,添加GENERATED ALWAYS子句以指示该列是已生成的列。
然后,使用相应的选项指示所生成列的类型:VIRTUAL或STORED。
默认情况下,如果您未明确指定生成列的类型,则MySQL使用VIRTUAL。
之后,在AS关键字后的花括号内指定表达式。
该表达式可以包含文字,不带参数的内置函数,运算符或对同一表中任何列的引用。
如果使用函数,则它必须是标量和确定性的。
最后,如果存储了生成的列,则可以为其定义一个唯一约束。
MySQL存储列示例
让我们看一下示例数据库中的产品表。
来自quantityInStock和buyPrice列的数据使我们可以使用以下表达式来计算每个SKU的股票价值:
quantityInStock * buyPrice
但是,我们可以使用以下ALTER TABLE ... ADD COLUMN语句将一个名为stock_value的存储的已生成列添加到product表中:
ALTER TABLE products ADD COLUMN stockValue DOUBLE GENERATED ALWAYS AS (buyprice*quantityinstock) STORED;
通常,ALTER TABLE语句需要完整的表重建,因此,如果更改大表,则很耗时。
但是,虚拟列不是这种情况。
现在,我们可以直接从产品表中查询库存值。
SELECT productName, ROUND(stockValue, 2) stock_value FROM products;
在本教程中,您学习了如何使用MySQL生成的列来存储从表达式或其他列计算出的数据。