Mysql的组合字段Generated Column

所谓组合字段(自创的名字,没有在网上找到通用的名字),是MySQL5.7加入的新功能,可以定义一个字段,值是其他字段值的组合。

官网中举了一个勾股定理的例子:

CREATE TABLE triangle (

 sidea DOUBLE,

 sideb DOUBLE,

 sidec DOUBLE AS (SQRT(sidea * sidea + sideb * sideb))

);

INSERT INTO triangle (sidea, sideb) VALUES(1,1),(3,4),(6,8);

这个例子的意思是说sidec字段的值是sidea和sideb字段值的平方和再开方,在insert该表数据的时候可以不指定sidec的值,MySQL会自己计算。


这种组合字段有两种形式,Virtual Generated ColumnStored Generated Column,可以理解为虚拟组合列和存储组合列,Virtual Generated Column的数值不会存放在磁盘上,比较省空间,就是效率不高,如果需要查询建议加索引。

默认是Virtual Generated Column,如果要设置Stored Generated Column,需要在建表语句加上STORED关键字:

CREATE TABLE triangle (

 sidea DOUBLE,

 sideb DOUBLE,

 sidec DOUBLE AS (SQRT(sidea * sidea + sideb * sideb) STORED)

);

字段设置为组合字段之后,如果数据库操作出现明显的逻辑错误,操作将被阻止,比如:

情况1:

把字段C设置为字段A除以字段B,然后试图insert一条字段A是1,字段B是0的数据,MySQL会提示错误。

情况2:

把字段C设置为字段A除以字段B,并把字段B设置为varchar类型。

建表可以成功。

insert一条字段A为1,字段B为2的数据,可以成功。

insert一条字段A为1,字段B为abc的数据,MySQL会提示错误。

以上可以看到,除非遇见MySQL实在解决不了的问题,多数数据库操作还是可以被允许的。

 

另外,因为Virtual Generated Column在磁盘上不保存数据,所以带来了一些使用上的特点,比如聚簇索引、全文索引、空间索引,都不能用,外键也不能用。

你可能感兴趣的:(MySQL)