兩種完全不同的 REPLACE
| 類型 | 語法 | 用途 |
| 字符串函數 | REPLACE(str, from_str, to_str) | 列值/字符串內容替換 |
| DML 語句 | REPLACE INTO tbl(col...) VALUES(...) | 主鍵/唯一鍵衝突時覆蓋插入 |
1. REPLACE 字符串函數
基本語法
REPLACE(str, from_str, to_str)
-- 返回:str 中所有 from_str 替換為 to_str 後的新字符串
-- 特性:多字節安全、任一參數為 NULL 則返回 NULL
實戰範例
-- 單次替換
SELECT REPLACE('www.mysql.com', 'w', 'Ww'); -- 'WwWwWw.mysql.com'
-- 批量清洗敏感詞
UPDATE bb_topic
SET content = REPLACE(REPLACE(content, '敏感詞1', ''), '敏感詞2', '')
WHERE content LIKE '%敏感詞1%' OR content LIKE '%敏感詞2%';
-- CMS 內容遷移:清理舊域名
UPDATE dede_addonarticle SET body = REPLACE(body, '', '');
UPDATE dede_addonarticle SET body = REPLACE(body, '', '');
UPDATE dede_archives SET title = REPLACE(title, '大洋新聞 - ', '');
UPDATE dede_addonarticle SET body = REPLACE(body, '../../../../../../', 'https://new.domain/path/');
數值類型隱式轉換陷阱
-- 數值會被轉為二進制字符串再替換
SELECT REPLACE(12345, '3', 'X'); -- '12X45' (隱式 CAST)
-- 避免隱式轉換:顯式 CAST
SELECT REPLACE(CAST(int_col AS CHAR), '3', 'X');
2. REPLACE INTO 語句
行為邏輯
- 嘗試插入新行
- 若主鍵/唯一鍵衝突 → 刪除舊行 → 插入新行
- 本質:
DELETE + INSERT,觸發器按此順序觸發
關鍵差異對比
| 場景 | REPLACE INTO | INSERT ... ON DUPLICATE KEY UPDATE |
| 未指定列 | 置 NULL | 保留原值 |
| 自增 ID | 重新分配 | 保持不變 |
| 外鍵關聯 | 可能觸發級聯刪除 | 安全 |
| 性能 | 較慢(雙操作) | 較快(單操作) |
適用建議
- ✅ 需要完全覆蓋、主鍵業務無關、無外鍵依賴
- ❌ 避免用於有自增 ID 業務關聯、有外鍵、需保留部分列的表