標準 SQL 三大更新語句:INSERT、UPDATE、DELETE。MySQL 獨有增強:REPLACE。
-- 標準形式:欄位與值分離
INSERT INTO users (id, name, age) VALUES (123, '姚明', 25);
-- MySQL 擴展 SET 形式:欄位值成對出現
INSERT INTO users SET id = 123, name = '姚明', age = 25;
自增/預設值欄位可省略:
INSERT INTO users (name, age) VALUES ('姚明', 25);
INSERT INTO users SET name = '姚明', age = 25;
INSERT INTO users (name, age) VALUES
('姚明', 25),
('比爾·蓋茨', 50),
('火星人', 600);
關鍵規則:每組值必須用括號包裹,組間用逗號分隔。
錯誤寫法:VALUES (1,2,3,4,5)→ 視為單行 5 欄位
正確寫法:VALUES (1),(2),(3),(4),(5)→ 5 行 1 欄位
觸發條件:表有 PRIMARY KEY 或 UNIQUE 索引,且新行鍵值與現有行衝突。
行為:自動刪除衝突舊行 → 插入新行。單語句原子操作,無需顯式事務。
REPLACE INTO users (id, name, age) VALUES (123, '趙本山', 50);
REPLACE INTO users SET id = 123, name = '趙本山', age = 50;
REPLACE INTO users (id, name, age) VALUES (123, '趙本山', 50), (134, 'Mary', 15);
| 回傳值 | 含義 |
|---|---|
| 1 | 純插入,無衝突 |
| 2 | 1 衝突:1 刪 + 1 插 |
| >2 | 多唯一索引各衝突:多刪 + 1 插 |
CREATE TABLE t1 (
a INT NOT NULL UNIQUE,
b INT NOT NULL UNIQUE,
c INT NOT NULL UNIQUE
);
-- 既有 (1,1,1), (2,2,2), (3,3,3)
REPLACE INTO t1 (a,b,c) VALUES (1,2,3);
-- 影響 4 行:刪除 3 行 + 插入 1 行
-- 結果僅剩 (1,2,3)
UPDATE users SET age = 26 WHERE id = 123;
UPDATE users SET age = age + 1 WHERE id = 123; -- 相對更新
UPDATE LOW_PRIORITY users SET ... WHERE ...; -- 降低寫入優先級
DELETE FROM users WHERE id = 123;
DELETE FROM users WHERE id > 100 LIMIT 10; -- 限制刪除筆數
DELETE FROM users; -- 清空表(比逐行刪快得多)
TRUNCATE TABLE 或無 WHERE DELETE:避免逐行鎖開銷--i-am-a-dummy 強制要求 WHEREINSERT DELAYED 非同步寫入:日誌類高寫入低一致性場景