表 A 有聯合主鍵 (a, b, c),需複製現有數據並將字段 c 從 0 改為 1,最終表包含原數據與新數據。
INSERT INTO A (a, b, c)
SELECT a, b, '1'
FROM A;
原理:SELECT 先讀取快照,再插入新行,不會陷入無限循環。DB2 支持此標準語法。
-- 1. 複製結構
CREATE TABLE A_TMP LIKE A;
-- 2. 複製數據並修改
INSERT INTO A_TMP
SELECT a, b, '1' FROM A;
-- 3. 合併回目標表
INSERT INTO A SELECT * FROM A_TMP;
-- 4. 清理
DROP TABLE A_TMP;
| 指標 | 方案一 | 方案二 |
|---|---|---|
| SQL 複雜度 | 極低 | 中等 |
| 鎖持有時間 | 短(單語句) | 長(多語句事務) |
| 適用場景 | 單表簡單字段映射 | 跨表、多步轉換、需中間校驗 |
| 並發影響 | 極小 | 較大 |
c 為 CHAR/VARCHAR 時,'1' 需匹配定義長度,建議顯式 CAST('1' AS CHAR(10))。INSERT ... SELECT ... FETCH FIRST 10000 ROWS ONLY 循環執行。