首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> MySQL 資料庫 >> MySQL 綜合教學

MySQL REPLACE INTO 實戰詳解:INSERT ... ON DUPLICATE KEY UPDATE 的增強替代方案與三種語法形式

     編輯:MySQL 綜合教學

業務常見需求:「資料存在則更新,不存在則插入」。SQL Server 用 IF NOT EXISTS ... INSERT ELSE UPDATE,MySQL 有更簡潔的 REPLACE INTO。本文詳細對比 REPLACE INTO、INSERT IGNORE、ON DUPLICATE KEY UPDATE 三者差異,說明 REPLACE INTO 的「刪除舊行再插入」機制、三種語法形式、主鍵/唯一索引前置條件與自增 ID 變更副作用。

核心機制對比

語法衝突處理自增 ID觸發器適用場景
INSERT IGNORE跳過、不報錯不變不觸發冪等寫入、日誌
ON DUPLICATE KEY UPDATE更新指定欄位不變觸發 UPDATE計數器、Upsert
REPLACE INTODELETE 舊行 + INSERT 新行重新分配觸發 DELETE + INSERT全行替換、結構同步

前置條件:必須有 PRIMARY KEY 或 UNIQUE INDEX

無唯一約束時,REPLACE INTO 退化為單純 INSERT,導致重複資料。

三種語法形式

-- 1. VALUES 形式(最常用)
REPLACE INTO t(id, update_time) VALUES(1, NOW());

-- 2. SELECT 形式
REPLACE INTO t(id, update_time) SELECT 1, NOW();

-- 3. SET 形式
REPLACE INTO t SET id=1, update_time=NOW();

INTO 關鍵字可省略,建議保留以提高可讀性。未指定欄位將自動填入預設值。

實戰範例:Session 管理

CREATE TABLE user_session (
  user_id INT PRIMARY KEY,
  token CHAR(32),
  last_active TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
);

-- 用戶登入/心跳:存在則刷新 token/時間,不存在則建立
REPLACE INTO user_session (user_id, token) VALUES (1001, 'abc123...');

副作用與避坑

  • 自增 ID 改變:若表有 AUTO_INCREMENT 主鍵且未在 REPLACE 中指定,新行將獲得新 ID,舊 ID 釋放 → 關聯表外鍵失效。
  • 外鍵 CASCADE:若有 ON DELETE CASCADE 子表,舊行刪除會連帶刪除子表資料。
  • 觸發器雙重觸發:BEFORE DELETE、AFTER DELETE、BEFORE INSERT、AFTER INSERT 全走一遍。
  • 效能:比 ON DUPLICATE KEY UPDATE 慢(兩次寫入、索引維護)。

選型建議

  1. 需精確控制更新欄位、保持 ID 不變 → ON DUPLICATE KEY UPDATE。
  2. 需全行替換、不介意 ID 變更 → REPLACE INTO。
  3. 3. 純冪等寫入、不需更新 → INSERT IGNORE。

理解「刪除再插入」本質,才能在正確場景用好 REPLACE INTO。

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