首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計疑難解答

新增 UUID 字段如何為現有數據初始化賦值

     編輯:程式設計疑難解答

場景

表新增 `uuid` 列 (非空唯一),歷史數據該列為 `NULL`,需批量生成 UUID 回填且不影響現有業務。

方案一:SQL 批量更新 (最直接)


-- 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`;

執行步驟建議

  1. 備份數據庫。
  2. 2. 添加列允許 NULL:`ALTER TABLE t ADD uuid VARCHAR(36);` 3. 批量回填歷史數據 (方案一/二)。 4. 驗證無 NULL/重複:`SELECT COUNT(*) FROM t WHERE uuid IS NULL; SELECT uuid, COUNT(*) FROM t GROUP BY uuid HAVING COUNT(*)>1;` 5. 修改列非空 + 添加唯一索引:`ALTER TABLE t MODIFY uuid VARCHAR(36) NOT NULL; ALTER TABLE t ADD UNIQUE INDEX uk_uuid (uuid);` 6. 設置新數據默認值 (方案三)。 7. 發布應用代碼 (實體類添加字段、插入邏輯可移除手動生成)。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved