SQL 更新語句是數據操作的核心。MySQL 在標準 SQL(INSERT/UPDATE/DELETE)基礎上擴展了 REPLACE 語句,並提供獨特的多行插入語法。本文系統梳理 MySQL 更新語句的語法變體、行為差異與最佳實踐。
兩者均用於插入新數據,核心差異在於重複鍵值處理策略:
IGNORE 忽略)INSERT INTO users (id, name, age) VALUES (123, '姚明', 25);
-- 列名與值分離,數量順序必須一一對應
INSERT INTO users SET id = 123, name = '姚明', age = 25;
-- 列值成對出現,可讀性強,至少賦值一列
-- id 為 AUTO_INCREMENT 時
INSERT INTO users (name, age) VALUES ('姚明', 25);
INSERT INTO users SET name = '姚明', age = 25;
-- 甚至完全使用默認值
INSERT INTO users () VALUES ();
INSERT INTO users VALUES (123, '姚明', 25); -- 必須匹配所有列且順序固定
-- 易因表結構變更導致數據錯位,生產環境禁用
INSERT INTO users (name, age)
VALUES ('姚明', 25), ('比爾·蓋茨', 50), ('火星人', 600);
核心規則:每組值必須用 () 包裹,組間用逗號分隔。錯誤示例:VALUES (1,2,3,4,5) 會被視為單行 5 列而非 5 行 1 列,拋出 Column count doesn't match 錯誤。正確寫法:VALUES (1),(2),(3),(4),(5)。
性能優勢:單次解析優化、單次網絡往返、單次事務提交,批量寫入效率遠超循環調用單行 INSERT。
適用於業務主鍵天然唯一、需全量覆蓋更新的場景:
副作用警示:
DELETE + INSERT 觸發器INSERT INTO users (id, name, age) VALUES (123, '姚明', 26)
ON DUPLICATE KEY UPDATE name=VALUES(name), age=VALUES(age);
優勢:原地更新、保持自增 ID 不變、避免觸發器雙重觸發、減少索引維護開銷。推薦作為 REPLACE 的首選替代。