直接賦值更新
UPDATE scott.emp
SET empno = 8888,
ename = 'TOM',
hiredate = '03-9月-2002'
WHERE empno = 7566;
- 單表多列同時更新
- WHERE 子句精確定位目標行
- 執行截圖:

嵌套子查詢更新
UPDATE scott.emp
SET sal = (SELECT sal + 300 FROM scott.emp WHERE empno = 7599)
WHERE empno = 7599;
- 子查詢返回單值 (標量子查詢)
- 可引用同表或其他表
- 子查詢無行 → 目標列置 NULL;多行 → 報錯 ORA-01427
- 執行截圖:

進階更新模式
| 模式 | 語法示例 | 注意點 |
| 多列子查詢 | SET (col1,col2) = (SELECT col1,col2 FROM ...) | 子查詢列數/類型須匹配 |
| 相關子查詢 | SET sal = (SELECT AVG(sal) FROM emp e2 WHERE e2.deptno = emp.deptno) | 逐行執行,大表慎用 |
| MERGE 更新 | MERGE INTO target USING source ON (...) WHEN MATCHED THEN UPDATE SET ... | 單語句完成 UPSERT,性能最優 |
| 返回更新行 | UPDATE ... SET ... WHERE ... RETURNING col INTO :var | PL/SQL 獲取變更值 |
最佳實踐
- 大批量更新分批次 COMMIT,避免 UNDO 表空間爆滿、鎖升級。
- 更新主鍵/唯一鍵列極度謹慎,需確保無外鍵引用或級聯更新。
- 利用
EXPLAIN PLAN 確認索引使用,避免全表掃描更新。
- 生產環境更新前必備:備份、腳本審核、回滾方案、變更窗口。