本文系統梳理 MySQL 與 SQL Server 在 DDL、DML、系統函數等核心語法上的 10 大關鍵差異,為跨平台遷移與雙資料庫開發提供快速參考。
-- SQL Server:需括號
CREATE TABLE emp (id INT DEFAULT(12));
-- MySQL:無需括號
CREATE TABLE emp (id INT DEFAULT 12);
-- SQL Server:IDENTITY(種子, 遞增)
CREATE TABLE emp (id INT IDENTITY(1,1));
-- MySQL:AUTO_INCREMENT,必須為 PRIMARY KEY,種子在表選項設定
CREATE TABLE emp (
id INT PRIMARY KEY AUTO_INCREMENT
) AUTO_INCREMENT = 100; -- 從 100 開始
-- MySQL 獲取自增值的 4 種方法:
-- 1. SELECT MAX(id) FROM emp -- 不推薦,高併發不準
-- 2. SELECT LAST_INSERT_ID() -- 會話級,安全但跨表無效
-- 3. SELECT @@IDENTITY -- 全域變數,連線關閉失效
-- 4. SHOW TABLE STATUS LIKE 'emp' -- 推薦,查看 Auto_increment 欄位
-- SQL Server
EXEC sp_help 'emp';
-- MySQL
DESC emp; -- 或 SHOW COLUMNS FROM emp;
-- SQL Server
EXEC sys.sp_rename @objname = N'emp', @newname = 'emp2';
-- MySQL
ALTER TABLE emp RENAME emp2; -- 或 RENAME TABLE emp TO emp2;
-- SQL Server
ALTER TABLE emp2 ALTER COLUMN id BIGINT;
-- MySQL
ALTER TABLE emp2 MODIFY id BIGINT;
-- SQL Server
EXEC sys.sp_rename @objname = N'emp2.id', @newname = 'iid', @objtype = 'column';
-- MySQL:CHANGE 舊名 新名 類型
ALTER TABLE emp2 CHANGE id iid BIGINT;
-- 僅改類型時新舊名相同
ALTER TABLE emp2 CHANGE id id BIGINT; -- 等同 MODIFY
-- SQL Server:僅能加在末尾
ALTER TABLE emp2 ADD name NVARCHAR(200) NULL;
-- MySQL:可指定 FIRST / AFTER 欄位名
ALTER TABLE emp2 ADD name NVARCHAR(200) NULL FIRST;
ALTER TABLE emp2 ADD age INT NULL AFTER name;
-- SQL Server:需 COLUMN 關鍵字
ALTER TABLE emp2 DROP COLUMN name;
-- MySQL:無需 COLUMN
ALTER TABLE emp2 DROP name;
-- SQL Server:統一 DROP CONSTRAINT
ALTER TABLE emp2 DROP CONSTRAINT fk_emp_dept;
-- MySQL:分類明確
ALTER TABLE emp2 DROP FOREIGN KEY fk_emp_dept; -- 外鍵
ALTER TABLE emp2 DROP PRIMARY KEY; -- 主鍵
-- SQL Server:需逐表判斷
IF OBJECT_ID('dbo.emp2') IS NOT NULL DROP TABLE dbo.emp2;
-- MySQL:單條語句多表、條件刪除
DROP TABLE IF EXISTS emp1, emp2;
| 操作 | SQL Server | MySQL | 關鍵差異 |
|---|---|---|---|
| DEFAULT | DEFAULT(值) | DEFAULT 值 | 括號 |
| 自增 | IDENTITY(1,1) | AUTO_INCREMENT + PK | 種子設定位置、PK強制 |
| 改表名 | sp_rename | RENAME TABLE / ALTER RENAME | 系統預存程序 vs DDL |
| 改欄位名 | sp_rename | CHANGE 老 新 類型 | MySQL需帶類型 |
| 加欄位位置 | 不支援 | FIRST/AFTER | MySQL靈活 |
| 刪約束 | DROP CONSTRAINT | DROP FOREIGN KEY/PRIMARY KEY | MySQL分類更細 |
| 批量刪表 | 逐條判斷 | DROP TABLE IF EXISTS t1,t2 | MySQL簡潔 |