首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 更多程式設計知識

SQL 跨欄位資料複製與字串串聯實戰指南

     編輯:更多程式設計知識

場景一:將既有欄位值複製到新欄位

新增欄位 B,需同步現有欄位 A 的資料:

UPDATE _temp SET B = A;

⚠️ 關鍵提醒

  • 空值表放左邊:SET B = A 正確;SET A = B 會把 A 全部變成 NULL (因為 B 是新欄位皆為 NULL)。
  • 執行前必備份:大量 UPDATE 鎖表久、回滾慢,建議先 BACKUP DATABASE 或 SELECT * INTO _temp_bak FROM _temp。
  • 分批處理大表:超過 10 萬筆建議分批 WHERE id BETWEEN ... 避免長事務阻塞。

場景二:字串串聯更新 (將 B 附加到 A 後方)

需求: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

進階場景:條件式複製與轉換

1. 僅複製非空值

UPDATE _temp SET B = A WHERE A IS NOT NULL;

2. 複製並轉換型別 (如 int 轉 varchar)

-- SQL Server
UPDATE _temp SET B = CAST(A AS VARCHAR(20));

-- MySQL
UPDATE _temp SET B = CAST(A AS CHAR);

3. 多表關聯複製

-- 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;

效能與安全最佳實踐

  1. 索引支援:WHERE 條件欄位加索引,減少掃描範圍。
  2. 避免全表掃描:大表務必加 WHERE 過濾或分批。
  3. 交易控制:
    BEGIN TRANSACTION;
    UPDATE ...;
    -- 驗證筆數 SELECT COUNT(*) FROM ... WHERE ...;
    COMMIT; -- 或 ROLLBACK;
  4. 觸發器/CDC:若需即時同步,考慮 AFTER UPDATE TRIGGER 或 Change Data Capture,避免人工腳本延遲。
  5. 權限最小化:執行帳號僅需該表 UPDATE 權限,不可給 DROP/TRUNCATE。

常見錯誤與除錯

  • 源欄位寫右邊,目標寫左邊
  • 錯誤現象 原因 修正
    目標欄位全變 NULL 對調賦值方向
    字串截斷 目標欄位長度不足 ALTER TABLE ... ALTER COLUMN B VARCHAR(500)
    型別衝突 數值欄位直接存字串 使用 CAST/CONVERT 顯式轉型
    執行極慢/鎖死 無 WHERE 條件全表更新 加條件、分批、離線維護窗口執行

    結語

    跨欄位複製看似簡單,實則暗藏方向性陷阱、型別陷阱、鎖表風險。牢記「目標在左、來源在右、先備份再執行、大表分批處理」八字訣,配合資料庫特定串聯語法,即能安全、高效完成資料遷移與清洗任務。

    1. 上一篇文章:
    2. 下一篇文章:
    Copyright © 程式碼之家 All Rights Reserved