如何在SELECT查询中复用函数返回值,避免重复调用生成不同结果
解决方案
核心解决思路
每行仅调用一次CREATE_UUID()生成UUID,再将同一个生成值赋值给两个目标列,既可以保证同一行的两个UUID值一致,也不会影响不同行的UUID唯一性。
通用兼容方案(支持CTE的数据库)
使用CTE提前为每行生成一次UUID,外层插入时直接引用同一个生成值即可,该方案兼容MySQL 8.0+、PostgreSQL、SQL Server、Oracle等绝大多数主流数据库:
WITH source_data AS ( SELECT ROWID, CREATE_UUID() AS gen_uuid FROM AnotherTable ) INSERT INTO Table (id, uuid1, uuid2) SELECT ROWID, gen_uuid, gen_uuid FROM source_data;
旧版本数据库兼容方案(不支持CTE的场景)
如果使用的是不支持CTE的旧版本数据库(如MySQL 5.x),可以用嵌套子查询实现相同效果:
INSERT INTO Table (id, uuid1, uuid2) SELECT ROWID, gen_uuid, gen_uuid FROM ( SELECT ROWID, CREATE_UUID() AS gen_uuid FROM AnotherTable ) AS temp_data;
注意事项
请确保自定义的CREATE_UUID()函数为非确定性函数(每次调用返回独立的新值),只要函数本身符合UUID生成的唯一性规则,不同行生成的UUID就不会出现重复。
内容的提问来源于stack exchange,提问作者liux
相关产品推荐
相关产品推荐

