首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫

MSSQL 對比學習 MySQL(八):INSERT/UPDATE/DELETE 核心差異詳解

     編輯:MySQL 資料庫相關知識

INSERT 差異全景

1. INSERT ... SELECT 多行插入

兩者均支持:

INSERT INTO person(id, name, age, info)
SELECT id, name, age, info FROM person_old;

2. 重複鍵處理:MySQL 三板斧 vs MSSQL 一招

方案MySQLMSSQL
忽略重複INSERT IGNORE ...建表指定 WITH (IGNORE_DUP_KEY = ON)
替換重複REPLACE INTO ...MERGE / UPSERT 模式
更新重複ON DUPLICATE KEY UPDATE ...MERGE WHEN MATCHED THEN UPDATE

3. 自增列插入自由度

-- 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;

4. 唯一索引與 NULL 值語義差異

MySQL:唯一索引允許多個 NULL(視為不同值)

INSERT INTO test(a) VALUES (NULL), (NULL);  -- 成功,不視為重複

MSSQL:唯一索引視 NULL 為相等值,僅允許一個 NULL

-- 第二次插入報錯:重複鍵值為 (<NULL>)

UPDATE 差異

基本語法一致,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';

DELETE / TRUNCATE 差異

操作MySQLMSSQL
DELETE 全表DELETE FROM personDELETE FROM person
TRUNCATETRUNCATE TABLE person(重置自增)TRUNCATE TABLE person(重置自增)
性能TRUNCATE ≫ DELETETRUNCATE ≫ DELETE
事務日誌TRUNCATE 少記錄TRUNCATE 少記錄

MyISAM 實測(30 行)

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 開始)

核心差異總結表

特性MySQLMSSQL遷移注意
重複鍵忽略INSERT IGNOREIGNORE_DUP_KEY語法完全不同
自增列顯式插入自由需 SET IDENTITY_INSERT ON遷移腳本需調整
唯一索引 NULL允許多 NULL僅允許一 NULL業務邏輯可能受影響
多表 UPDATEJOIN 語法FROM 子句語法重寫
UPSERTON DUPLICATE KEY UPDATEMERGE邏輯對等,語法不同

遷移實戰建議

  1. 梳理所有 INSERT 語句,識別自增列顯式賦值、重複鍵處理邏輯
  2. 唯一約束列的 NULL 語義差異需業務確認,必要時調整約束
  3. 複雜 MERGE 改寫為 ON DUPLICATE KEY UPDATE 或 REPLACE INTO
  4. 批量測試驗證自增值生成行為
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved