新增欄位 B,需同步現有欄位 A 的資料:
UPDATE _temp SET B = A;
SET B = A 正確;SET A = B 會把 A 全部變成 NULL (因為 B 是新欄位皆為 NULL)。BACKUP DATABASE 或 SELECT * INTO _temp_bak FROM _temp。WHERE id BETWEEN ... 避免長事務阻塞。需求:A="我", B="們" → 更新後 A="我們", B 不變。
UPDATE table_name SET A = A + B;
| 資料庫 | 運算子/函數 | 範例 |
|---|---|---|
| SQL Server | + |
SET A = A + B |
| MySQL / PostgreSQL | CONCAT() |
SET A = CONCAT(A, B) |
| Oracle | || |
SET A = A || B |
| SQLite | || |
SET A = A || B |
UPDATE _temp SET B = A WHERE A IS NOT NULL;
-- SQL Server
UPDATE _temp SET B = CAST(A AS VARCHAR(20));
-- MySQL
UPDATE _temp SET B = CAST(A AS CHAR);
-- SQL Server 語法
UPDATE t1
SET t1.target_col = t2.source_col
FROM target_table t1
INNER JOIN source_table t2 ON t1.id = t2.ref_id
WHERE t2.status = 1;
WHERE 過濾或分批。BEGIN TRANSACTION;
UPDATE ...;
-- 驗證筆數 SELECT COUNT(*) FROM ... WHERE ...;
COMMIT; -- 或 ROLLBACK;
AFTER UPDATE TRIGGER 或 Change Data Capture,避免人工腳本延遲。UPDATE 權限,不可給 DROP/TRUNCATE。| 錯誤現象 | 原因 | 修正 |
|---|---|---|
| 目標欄位全變 NULL | 對調賦值方向 | |
| 字串截斷 | 目標欄位長度不足 | ALTER TABLE ... ALTER COLUMN B VARCHAR(500) |
| 型別衝突 | 數值欄位直接存字串 | 使用 CAST/CONVERT 顯式轉型 |
| 執行極慢/鎖死 | 無 WHERE 條件全表更新 | 加條件、分批、離線維護窗口執行 |
跨欄位複製看似簡單,實則暗藏方向性陷阱、型別陷阱、鎖表風險。牢記「目標在左、來源在右、先備份再執行、大表分批處理」八字訣,配合資料庫特定串聯語法,即能安全、高效完成資料遷移與清洗任務。