如何使用MySQL生成的列

时间:2019-11-20 08:52:10  来源:igfitidea点击:

简介:在本教程中,您将学习如何使用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生成的列来存储从表达式或其他列计算出的数据。