常見需求:在不覆蓋原有資料的前提下,將新字串**附加**到現有欄位末尾。例如:
UPDATE `table_name`
SET `column_name` = CONCAT(`column_name`, '要追加的字串')
WHERE `condition_column` = 'condition_value';
UPDATE `users`
SET `remarks` = CONCAT(`remarks`, '\n[2024-01-15 10:30] 管理員修改了權限')
WHERE `id` = 1001;
UPDATE `products`
SET `title` = CONCAT('[熱銷] ', `title`)
WHERE `category_id` = 5 AND `status` = 'active';
若欄位為 JSON 類型,建議使用 JSON_ARRAY_APPEND():
UPDATE `orders`
SET `tags` = JSON_ARRAY_APPEND(`tags`, '$', '優先處理')
WHERE `id` = 888;
CONCAT() 任一參數為 NULL 會回傳 NULL。解決:
-- 使用 COALESCE 或 IFNULL
SET `col` = CONCAT(COALESCE(`col`, ''), '新內容');
-- 或
SET `col` = CONCAT(IFNULL(`col`, ''), '新內容');
-- 單引號需轉義
SET `col` = CONCAT(`col`, '它的名字叫 "O\'Reilly"');
-- 或使用參數化查詢(PDO)
$stmt = $pdo->prepare("UPDATE t SET c = CONCAT(c, ?) WHERE id = ?");
$stmt->execute(["新內容", $id]);
CONCAT 會產生新字串,大量資料更新時會產生大量 I/O。OPTIMIZE TABLE。user_logs),而非單欄位疊加。-- 移除最後 10 個字元
UPDATE `t` SET `c` = SUBSTRING(`c`, 1, CHAR_LENGTH(`c`) - 10);
CONCAT(column, 'string') 是 MySQL 原地追加字串的標準做法,簡單高效。記得處理 NULL、轉義特殊字元,並在大數據量時評估效能影響。若是結構化資料(JSON、陣列、日誌),優先考慮**正規化設計**拆分到獨立資料表,長期維護更優雅。