UPDATE 陳述式用於修改資料表中現有列的欄位值。本文說明標準語法、參數說明、執行流程與關鍵注意事項。
UPDATE table_name
SET column1 = expression1, column2 = expression2, ...
[WHERE search_condition];
| 參數 | 說明 |
|---|---|
table_name | 要更新的資料表名稱 (可含結構描述 schema.table) |
column | 要修改的欄位名稱 |
expression | 新值運算式:常值、欄位運算、函數、子查詢、CASE 運算式等 |
WHERE search_condition | 篩選條件:只有符合條件的列會被更新。省略則更新全表 (極度危險) |
WHERE 定位符合條件的列 (加鎖)。SET 運算式的新值。@@ROWCOUNT)。-- 單欄更新
UPDATE Products SET UnitPrice = 19.95 WHERE ProductID = 1;
-- 多欄更新
UPDATE Employees
SET Salary = Salary * 1.05, LastRaiseDate = GETDATE()
WHERE DeptID = 10;
-- 條件運算式更新
UPDATE Orders
SET Status = CASE
WHEN ShipDate IS NOT NULL THEN 'Shipped'
WHEN OrderDate < DATEADD(DAY, -30, GETDATE()) THEN 'Overdue'
ELSE 'Pending'
END
WHERE Status <> 'Cancelled';
WHERE 的 UPDATE。WHERE 先查詢,確認受影響列數與資料正確。SET col = NULL 會清空欄位;若要保留原值需用 ISNULL/COALESCE。AFTER UPDATE / INSTEAD OF UPDATE 觸發器。UPDATE 權限 (或透過預存程序授權)。@@ROWCOUNT:受影響列數 (0 表示無列符合條件)。SELECT @RowCount = @@ROWCOUNT。BEGIN TRY
BEGIN TRANSACTION;
-- 1. 驗證
DECLARE @Cnt INT;
SELECT @Cnt = COUNT(*) FROM TargetTable WHERE FilterCol = @Value;
IF @Cnt = 0
BEGIN
RAISERROR(N'無符合條件資料', 16, 1);
END
-- 2. 更新
UPDATE TargetTable
SET Col1 = @NewVal1, Col2 = @NewVal2
WHERE FilterCol = @Value;
-- 3. 確認
IF @@ROWCOUNT <> @Cnt
BEGIN
RAISERROR(N'受影響列數不符,可能有並發衝突', 16, 1);
END
COMMIT TRANSACTION;
END TRY
BEGIN CATCH
IF XACT_STATE() <> 0 ROLLBACK TRANSACTION;
-- 記錄錯誤、拋出或回傳錯誤碼
THROW;
END CATCH
UPDATE 是資料修改的核心指令。遵循「先查後改、分批執行、交易包裹、錯誤處理」四原則,即能安全高效完成資料維護。