數據操作語言(DML)是日常開發最高頻環節。MySQL 在標準 SQL 基礎上提供了批量寫入、REPLACE、ON DUPLICATE KEY UPDATE 等極具實用價值的擴展語法,掌握它們能大幅提升開發效率與系統效能。
INSERT INTO mytable(col1, col2, col3) VALUES ('val1', 'val2', 4);
INSERT INTO mytable(col1, col2, col3) SELECT col1, col2, col3 FROM copytable;
-- 僅結構 CREATE TABLE newtable SELECT * FROM copytable WHERE 1=2; -- 結構+數據 CREATE TABLE newtable SELECT * FROM copytable;
注意:索引、約束、觸發器不會複製,需手動補充。
INSERT INTO mytable (col1, col2, col3)
VALUES ('A','VAL1',1), ('B','VAL2',2), ('C','VAL3',3);
UPDATE mytable SET col1='A', col2='val1', col3=1 WHERE id='0001';
UPDATE newtable a, oldtable b SET a.col1=b.col1, a.col2=b.col2 WHERE a.id=b.id;
MySQL 不支援標準 SQL 的 FROM 子句更新寫法。
REPLACE INTO mytable (id, name) VALUES ('01','hello'), ('02','haha');
INSERT INTO mytable(id, name, col) VALUES (78,'456','55'), (88,'456','d') ON DUPLICATE KEY UPDATE name=VALUES(name), col=VALUES(col); -- 僅更新部分列 INSERT INTO mytable(id, name, col) VALUES (78,'456','55') ON DUPLICATE KEY UPDATE name=VALUES(name);
VALUES(col) 引用插入值,避免重複寫字面量DELETE FROM mytable WHERE id='001';
TRUNCATE TABLE mytable;
MySQL 允許非法日期寫入(如 '2024-13-45'),不報錯但存為 '0000-00-00 00:00:00'。
zeroDateTimeBehavior=convertToNull 或 =roundsql_mode=NO_ZERO_DATE,NO_ZERO_IN_DATE| 場景 | 推薦語法 | 關鍵點 |
|---|---|---|
| 單行插入 | INSERT ... VALUES (...) | 分號結尾 |
| 批量插入 | INSERT ... VALUES (),(),()... | 效能最高 |
| 全量覆蓋同步 | REPLACE INTO | 會重置未指定列 |
| 增量同步/去重 | INSERT ... ON DUPLICATE KEY UPDATE | 精準控制更新列 |
| 清空大表 | TRUNCATE TABLE | 不可回滾,自增歸零 |