兩者均支持:
INSERT INTO person(id, name, age, info) SELECT id, name, age, info FROM person_old;
| 方案 | MySQL | MSSQL |
|---|---|---|
| 忽略重複 | INSERT IGNORE ... | 建表指定 WITH (IGNORE_DUP_KEY = ON) |
| 替換重複 | REPLACE INTO ... | MERGE / UPSERT 模式 |
| 更新重複 | ON DUPLICATE KEY UPDATE ... | MERGE WHEN MATCHED THEN UPDATE |
-- MySQL:極靈活
INSERT INTO person(id, name) VALUES (NULL, 'Amy'); -- 自動分配
INSERT INTO person(id, name) VALUES (16, 'Tom'); -- 顯式指定(無衝突即可)
INSERT INTO person(name) VALUES ('Amy'); -- 省略自增列
-- MSSQL:受限
SET IDENTITY_INSERT person ON; -- 必須開啟才能顯式插入自增列
INSERT INTO person(id, name) VALUES (16, 'Tom');
SET IDENTITY_INSERT person OFF;
MySQL:唯一索引允許多個 NULL(視為不同值)
INSERT INTO test(a) VALUES (NULL), (NULL); -- 成功,不視為重複
MSSQL:唯一索引視 NULL 為相等值,僅允許一個 NULL
-- 第二次插入報錯:重複鍵值為 (<NULL>)
基本語法一致,MySQL 額外支持:
ORDER BY ... LIMIT n 限制更新行數LOW_PRIORITY / IGNORE 修飾符JOIN 更新語法更靈活-- MySQL 多表更新 UPDATE person p JOIN dept d ON p.dept_id = d.id SET p.bonus = p.salary * 0.1 WHERE d.name = 'Sales';
| 操作 | MySQL | MSSQL |
|---|---|---|
| DELETE 全表 | DELETE FROM person | DELETE FROM person |
| TRUNCATE | TRUNCATE TABLE person(重置自增) | TRUNCATE TABLE person(重置自增) |
| 性能 | TRUNCATE ≫ DELETE | TRUNCATE ≫ DELETE |
| 事務日誌 | TRUNCATE 少記錄 | TRUNCATE 少記錄 |
DELETE FROM person; -- 0.05 秒 TRUNCATE TABLE person; -- 0.00 秒
TRUNCATE TABLE person;
INSERT INTO person(name, age, info) VALUES ('Amy', 12, 'bb');
SHOW TABLE STATUS LIKE 'person'\G
-- Auto_increment: 2 (從 1 開始)
| 特性 | MySQL | MSSQL | 遷移注意 |
|---|---|---|---|
| 重複鍵忽略 | INSERT IGNORE | IGNORE_DUP_KEY | 語法完全不同 |
| 自增列顯式插入 | 自由 | 需 SET IDENTITY_INSERT ON | 遷移腳本需調整 |
| 唯一索引 NULL | 允許多 NULL | 僅允許一 NULL | 業務邏輯可能受影響 |
| 多表 UPDATE | JOIN 語法 | FROM 子句 | 語法重寫 |
| UPSERT | ON DUPLICATE KEY UPDATE | MERGE | 邏輯對等,語法不同 |
INSERT 語句,識別自增列顯式賦值、重複鍵處理邏輯MERGE 改寫為 ON DUPLICATE KEY UPDATE 或 REPLACE INTO