如何在Snowflake现有数据库中添加UUID列并完成回填?
解决现有大表添加UUID唯一ID列并回填的问题
你的语句报错核心原因是不同数据库的UUID生成函数语法不一致,下面针对主流数据库给出可直接执行的操作方案:
MySQL/MariaDB
MySQL系的UUID生成函数是UUID(),而非UUID_STRING()。操作步骤:
- 添加带默认值的UUID列,执行后会自动为现有百万行数据生成唯一ID:
ALTER TABLE T ADD COLUMN UniqueID varchar(36) DEFAULT UUID() NOT NULL;
- (可选)为确保唯一性,添加唯一索引:
ALTER TABLE T ADD UNIQUE INDEX idx_uniqueid (UniqueID);
SQL Server
SQL Server可用NEWID()生成随机UUID,或NEWSEQUENTIALID()生成有序UUID(大表性能更优):
- 添加列并自动回填数据:
ALTER TABLE T ADD UniqueID UNIQUEIDENTIFIER DEFAULT NEWID() NOT NULL;
若追求性能,改用有序UUID:
ALTER TABLE T ADD UniqueID UNIQUEIDENTIFIER DEFAULT NEWSEQUENTIALID() NOT NULL;
- 添加唯一约束:
ALTER TABLE T ADD CONSTRAINT UQ_T_UniqueID UNIQUE (UniqueID);
PostgreSQL
PostgreSQL需要先启用UUID扩展,且支持原生uuid类型(无需用varchar存储):
- 启用扩展(仅需执行一次):
CREATE EXTENSION IF NOT EXISTS "uuid-ossp";
- 添加UUID列并自动回填:
ALTER TABLE T ADD COLUMN UniqueID uuid DEFAULT uuid_generate_v4() NOT NULL;
- 添加唯一约束:
ALTER TABLE T ADD UNIQUE (UniqueID);
Oracle
Oracle用SYS_GUID()生成UUID,需转成字符串存储:
- 添加列并自动回填:
ALTER TABLE T ADD UniqueID VARCHAR2(36) DEFAULT RAWTOHEX(SYS_GUID()) NOT NULL;
- 添加唯一约束:
ALTER TABLE T ADD CONSTRAINT UQ_T_UniqueID UNIQUE (UniqueID);
大表操作优化提示
如果百万级表锁表风险高,可分三步操作(以MySQL为例):
-- 1. 先添加允许为空的列,避免锁表过久 ALTER TABLE T ADD COLUMN UniqueID varchar(36); -- 2. 批量更新回填UUID(大表可分批次执行,比如按主键分段) UPDATE T SET UniqueID = UUID() WHERE UniqueID IS NULL; -- 3. 修改列属性为NOT NULL并设置默认值 ALTER TABLE T MODIFY COLUMN UniqueID varchar(36) DEFAULT UUID() NOT NULL;
内容的提问来源于stack exchange,提问作者TheJr Robert
相关产品推荐
相关产品推荐

