所谓组合字段(自创的名字,没有在网上找到通用的名字),是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 Column与Stored 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在磁盘上不保存数据,所以带来了一些使用上的特点,比如聚簇索引、全文索引、空间索引,都不能用,外键也不能用。