生成列
生成列(Generated Columns)是数据库表中的一列,其值由表中的其他列的值通过一个表达式自动计算生成。这种列在创建时就定义了一个计算规则,数据库管理系统会根据这个规则自动填充列的值,而不需要用户显式地插入或更新这些值。应用场景比如数据集成同步时不支持转化,可以使用生成列进行转化
语法
- GENERATED ALWAYS AS (expr):通过表达式
expr
自动生成列的值。表达式可以包含常量和内置标量确定性SQL函数,不支持非确定性函数如(current_date\random\current_timestamp\上下文函数)或运算符,不支持聚合函数、窗口函数或表函数。支持分区列使用生成列
示例:
生成列和默认值区别
-
分区列支持:
- 默认值:当前不支持为分区列设置默认值。
- 生成列:支持为分区列生成值。
-
函数支持:
- 默认值:支持使用非确定性函数,如
current_timestamp()
- 生成列:不支持非确定性函数,只能使用确定性的标量函数。
- 默认值:支持使用非确定性函数,如
-
插入操作中的值指定:
- 默认值:在插入数据时,可以为列指定一个静态值,如果未指定,则使用默认值。
- 生成列:在插入数据时,不能为生成列指定值,其值完全由生成表达式决定。
-
列值来源:
- 默认值:不支持列的值来自其他列的转换。
- 生成列:支持列的值来自其他列的转换,即可以基于其他列的值计算生成。
-
现有数据行的处理:
- 默认值:当为现有表添加带有默认值的列时,已存在的数据行中的该列将填充为null。
- 生成列:对于已存在的数据行,生成列的值将根据生成表达式进行转换,并显示转换后的数据
使用限制
- 使用生成列时,您不能在插入操作中显式指定该列的值,它将由表达式自动生成。但是为了兼容Hive语法,Lakehouse允许您为分区字段指定一个静态值。然而,指定的静态值不会生效,查询结果仍然是由指定生成列表达式结果决定
- 不支持使用实时接口和批量接口写入,包括Studio数据集成的批量导入和实时写入。
- 生成列不支持非确定性函数如(current_date\random\current_timestamp\上下文函数)或运算符,不支持聚合函数、窗口函数或表函数。
插入数据
- 当使用生成列时,您不能为该列指定常量值。例如,如果hour列是由
col1
生成的,您不能在插入时指定hour的值。指定则会报错。
错误示例:
正确示例:
添加字段时指定生成列
语法
- GENERATED ALWAYS AS (expr):指定一个表达式,用于自动生成新添加列的值。对于表中已存在的数据行,该列将根据表达式的结果填充值。表达式可以包含常量和内置标量确定性SQL函数,非确定性函数如(current_date\random\current_timestamp等)或运算符,不支持聚合函数、窗口函数或表函数。
使用限制
- 不支持在已有的列添加生成列
示例
添加生成列
在这个例子中,generated_col
将被添加为表中的第一列,并且所有现有的数据行的 generated_col
将根据当前时间戳生成值。
联系我们