PostgreSQL UPDATE 完整支援 SQL 標準,並提供強大的 FROM 子句擴充,支援多表聯結更新。本文詳細說明語法、參數、輸出、範例與相容性說明。
UPDATE table_name
SET column_name = expression [, ...]
[WHERE condition];
UPDATE table_name
SET column_name = expression [, ...]
[FROM from_list]
[WHERE condition];
from_list:可包含其他資料表、子查詢、函數呼叫,支援 JOIN。SET 與 WHERE 中引用 FROM 列表中的欄位。FROM 列表中 (否則會建立自我聯結,需用別名區分)。| 參數 | 說明 |
|---|---|
table_name | 目標資料表 (可含結構描述) |
column_name | 要更新的欄位 |
expression | 任意運算式:常值、欄位、函數、子查詢、CASE、運算子等 |
from_list | PostgreSQL 擴充:來源表/查詢清單,支援 JOIN |
condition | 篩選條件,可引用 FROM 列表欄位 |
UPDATE count
count 為受影響列數。0 表示無列符合條件。
UPDATE films SET kind = 'Dramatic' WHERE kind = 'Drama';
-- 依據另一表資料更新
UPDATE employees e
SET salary = e.salary * 1.1
FROM departments d
WHERE e.dept_id = d.dept_id
AND d.name = 'Sales';
UPDATE products p
SET price = (SELECT AVG(price) FROM products WHERE category = p.category)
WHERE price IS NULL;
-- 更新單一元素
UPDATE sensors SET readings[3] = 100 WHERE id = 1;
-- 更新切片
UPDATE sensors SET readings[1:3] = ARRAY[10,20,30] WHERE id = 1;
-- 更新整個陣列
UPDATE sensors SET readings = ARRAY[1,2,3,4,5] WHERE id = 1;
| 標準/廠商 | 語法差異 |
|---|---|
| SQL 標準 (SQL:2003) | 定義 WHERE CURRENT OF cursor 定位更新,無 FROM 子句 |
| PostgreSQL | 支援標準語法 + FROM 子句擴充 (最實用) |
| SQL Server | UPDATE ... FROM ... JOIN (類似但語法不同) |
| Oracle | 標準語法 + WHERE EXISTS / MERGE,無 FROM 子句 |
| MySQL | UPDATE ... JOIN ... SET ... (支援多表) |
WHERE,避免全表更新。LIMIT / WHERE ctid IN (...))。RETURNING 子句取回更新後的值:UPDATE ... SET ... WHERE ... RETURNING id, col;。BEGIN ... COMMIT),設定 LOCK TABLE 避免併發衝突。PostgreSQL 的 UPDATE ... FROM 是極具表達力的擴充,善用它能以單一陳述式完成複雜多表同步邏輯。