如何在BigQuery中设置插入时自动生成UUID及时间戳列?
自动生成UUID与创建时间戳的方案
BigQuery 原生没有提供类 PostgreSQL/SQL 的行级触发器能力,但可以通过列默认值约束实现插入数据时自动生成UUID、created_date_time的需求,无需额外触发器逻辑:
- 建表时给UUID字段设置默认值为
GENERATE_UUID(),插入数据时不指定该字段值就会自动生成标准UUID字符串 - 给
created_date_time字段设置默认值为CURRENT_TIMESTAMP(),插入时自动填充当前时间戳
建表示例:
CREATE TABLE `项目ID.数据集名.表名` ( -- 自动生成的UUID主键 uuid STRING DEFAULT GENERATE_UUID(), -- 自动填充的创建时间 created_date_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP(), -- 更新时间字段,需手动处理 modified_date_time TIMESTAMP, -- 其他业务字段示例 user_id INT64, user_name STRING );
插入数据时不需要给上述两个默认值字段传值,示例插入语句:
INSERT INTO `项目ID.数据集名.表名`(user_id, user_name) VALUES (1001, '张三'), (1002, '李四');
modified_date_time处理方案与业务层生成的适用场景
modified_date_time因为需要在行更新时自动刷新,默认值约束无法实现该能力,目前BigQuery没有原生的自动更新修改时间的功能,有两种可选方案:
- 执行UPDATE DML语句时主动赋值:
UPDATE `项目ID.数据集名.表名` SET user_name = '张三改', modified_date_time = CURRENT_TIMESTAMP() WHERE user_id = 1001; - 如果你不想在SQL中每次重复写该逻辑,也可以选择在业务插入、更新请求的逻辑中统一生成UUID、创建时间、修改时间三个字段的值。
要不要在业务层生成的判断标准:
- 如果你的业务跨多区域部署、对时间一致性要求极高,或者后续有迁移数据库的需求,优先选择在业务层统一生成三类值,可控性更高
- 如果仅在BigQuery生态内处理数据,对时间精度要求不高,UUID和创建时间直接用默认值即可,减少业务代码冗余
内容的提问来源于stack exchange,提问作者GPP
相关产品推荐
相关产品推荐

