表新增 `uuid` 列 (非空唯一),歷史數據該列為 `NULL`,需批量生成 UUID 回填且不影響現有業務。
-- MySQL 8.0+ / PostgreSQL
UPDATE `table_name` SET `uuid` = UUID() WHERE `uuid` IS NULL;
-- SQL Server
UPDATE `table_name` SET `uuid` = NEWID() WHERE `uuid` IS NULL;
-- Oracle
UPDATE `table_name` SET `uuid` = SYS_GUID() WHERE `uuid` IS NULL;
**注意**:單條 `UUID()` 調用可能產生重複 (極低概率),大批量建議分批或用程序生成。
// Java 示例
List ids = jdbcTemplate.queryForList("SELECT id FROM t WHERE uuid IS NULL", Long.class);
for (Long id : ids) {
String uuid = UUID.randomUUID().toString().replace("-", "");
jdbcTemplate.update("UPDATE t SET uuid=? WHERE id=?", uuid, id);
}
// 分批提交,避免長事務
-- MySQL 8.0.13+ 支持函數默認值
ALTER TABLE `t` MODIFY `uuid` VARCHAR(36) NOT NULL DEFAULT (UUID());
-- PostgreSQL
ALTER TABLE `t` ALTER COLUMN `uuid` SET DEFAULT gen_random_uuid();
-- SQL Server
ALTER TABLE `t` ADD CONSTRAINT DF_t_uuid DEFAULT NEWID() FOR `uuid`;