如何在SQL的INSERT-SELECT操作中替换Sys_Guid类型的Record ID
解决方案:复制数据时生成新的唯一Record ID
嘿,这事儿好办!你现在的需求是通过INSERT-SELECT把旧表数据复制到新表,同时替换掉原有的Sys_Guid类型的record_id,给每行生成全新的唯一值对吧?
核心思路很简单:不要在SELECT子句里引用旧表的record_id,而是调用数据库自带的Guid生成函数,让它为每一行自动生成新的唯一ID。
下面分不同数据库给你具体的SQL示例:
1. Oracle(你提到的Sys_Guid就是Oracle的函数)
直接把SELECT里的record_id换成SYS_GUID()就行,它会为每一行生成一个唯一的16字节Guid:
INSERT INTO TABLE_NEW (record_id, date_time, name, xml_record, meta_data) SELECT SYS_GUID(), -- 生成新的唯一Guid REPLACE(date_time,'12.02.18','12.03.18'), name, REPLACE(xml_record,'cats','dogs'), REPLACE(meta_data,'human','alien') FROM TABLE_OLD;
2. 其他常见数据库的写法
如果你的数据库不是Oracle,也可以用对应的Guid生成函数:
SQL Server
用NEWID()(随机Guid)或者NEWSEQUENTIALID()(有序Guid,性能更优):
INSERT INTO TABLE_NEW (record_id, date_time, name, xml_record, meta_data) SELECT NEWID(), -- 替换成NEWSEQUENTIALID()也可以 REPLACE(date_time,'12.02.18','12.03.18'), name, REPLACE(xml_record,'cats','dogs'), REPLACE(meta_data,'human','alien') FROM TABLE_OLD;
MySQL
用UUID()生成标准的36字符Guid:
INSERT INTO TABLE_NEW (record_id, date_time, name, xml_record, meta_data) SELECT UUID(), REPLACE(date_time,'12.02.18','12.03.18'), name, REPLACE(xml_record,'cats','dogs'), REPLACE(meta_data,'human','alien') FROM TABLE_OLD;
PostgreSQL
需要先确保uuid-ossp扩展已安装,然后用gen_random_uuid():
-- 先安装扩展(如果还没装的话) CREATE EXTENSION IF NOT EXISTS "uuid-ossp"; INSERT INTO TABLE_NEW (record_id, date_time, name, xml_record, meta_data) SELECT gen_random_uuid(), REPLACE(date_time,'12.02.18','12.03.18'), name, REPLACE(xml_record,'cats','dogs'), REPLACE(meta_data,'human','alien') FROM TABLE_OLD;
注意事项
- 确保
TABLE_NEW的record_id字段类型和生成的Guid类型匹配:比如Oracle用RAW(16),SQL Server用UNIQUEIDENTIFIER,MySQL用CHAR(36),PostgreSQL用UUID。 - 如果
TABLE_NEW的record_id已经设置了默认值为对应的Guid生成函数,你甚至可以不用在INSERT语句里指定这个字段,不过显式写出来会更清晰,避免后续混淆。
内容的提问来源于stack exchange,提问作者m.weiloa
相关产品推荐
相关产品推荐

