需在同一交易中更新兩張關聯資料表的多個欄位。若拆成多條 UPDATE,缺乏交易控制時易導致資料不一致;若加交易則增加鎖持有時間。
SQL Server 支援在 UPDATE 中使用 JOIN,單一陳述式即可完成多表多欄位更新,隱含原子性。
UPDATE u
SET
u.renren = '',
b.renren_token = '',
b.rt_time = ''
FROM dbo.[user] AS u
INNER JOIN dbo.binding AS b ON u.uid = b.uid
WHERE u.uid = @TargetUID;
UPDATE u 指定目標別名,實際寫入的是 u 所屬資料表 (user) 的欄位;SET 子句中同樣可直接更新 b (binding) 的欄位。FROM 子句定義聯結關係,WHERE 過濾目標列。BEGIN TRAN。| 條件 | 說明 | ||
|---|---|---|---|
| 目標表唯一 | UPDATE 後只能跟一個目標別名,但 SET 可更新多表欄位 | ||
| 聯結鍵唯一 | ON 條件需保證 1:1 或 多:1,否則可能產生非預期多列更新 | ||
| 權限 | 需同時具備兩表的 UPDATE 權限 | ||
| 觸發器 | 兩表的 AFTER UPDATE 觸發器皆會各自觸發一次 |
| 方案 | 原子性 | 鎖持有時間 | 程式碼複雜度 |
|---|---|---|---|
| JOIN UPDATE (推薦) | ✅ | 最短 | 低 |
| 顯式交易 + 多 UPDATE | ✅ | 較長 | 中 |
| 預存程序 + TRY/CATCH | ✅ | 可控 | 高 |
| MERGE 陳述式 | ✅ | 中等 | 高 |