原問題針對 SQL Server 2012,但最佳回答給出的是 MySQL 語法。本文針對各主流數據庫給出正確的自增列定義方式。
CREATE TABLE 選課表 (
id INT IDENTITY(1,1) NOT NULL, -- 種子 1,增量 1
Num INT NOT NULL,
-- 其他列...
CONSTRAINT PK_選課表 PRIMARY KEY (id)
);
IDENTITY(1,1):起始值 1,每次遞增 1NOT NULL,IDENTITY 隱含非空SET IDENTITY_INSERT ON)
CREATE TABLE 選課表 (
id INT NOT NULL AUTO_INCREMENT,
Num INT NOT NULL,
PRIMARY KEY (id)
);
-- 現代語法 (10+)
CREATE TABLE 選課表 (
id INT GENERATED ALWAYS AS IDENTITY PRIMARY KEY,
Num INT NOT NULL
);
-- 兼容語法 (SERIAL)
CREATE TABLE 選課表 (
id SERIAL PRIMARY KEY,
Num INT NOT NULL
);
CREATE TABLE 選課表 (
id NUMBER GENERATED ALWAYS AS IDENTITY PRIMARY KEY,
Num NUMBER NOT NULL
);
-- 兼容舊版:序列 + 觸發器
CREATE SEQUENCE seq_選課表 START WITH 1 INCREMENT BY 1;
CREATE OR REPLACE TRIGGER trg_選課表
BEFORE INSERT ON 選課表
FOR EACH ROW
BEGIN
SELECT seq_選課表.NEXTVAL INTO :NEW.id FROM dual;
END;
CREATE TABLE 選課表 (
id INTEGER PRIMARY KEY AUTOINCREMENT, -- 或僅 INTEGER PRIMARY KEY
Num INTEGER NOT NULL
);
| 特性 | SQL Server | MySQL | PostgreSQL | Oracle |
|---|---|---|---|---|
| 語法關鍵字 | IDENTITY | AUTO_INCREMENT | GENERATED AS IDENTITY / SERIAL | GENERATED AS IDENTITY |
| 指定種子/增量 | IDENTITY(100,10) | 不支持 (需 ALTER TABLE AUTO_INCREMENT=100) | START WITH 100 INCREMENT BY 10 | START WITH 100 INCREMENT BY 10 |
| 允許顯式插入 | SET IDENTITY_INSERT ON | 允許 (需 0/NULL) | OVERRIDING SYSTEM VALUE | OVERRIDING SYSTEM VALUE |
| 獲取新 ID | SCOPE_IDENTITY() | LAST_INSERT_ID() | RETURNING id / currval() | RETURNING id INTO :var |
| 類型要求 | 整數類型 | 整數類型 | SMALLINT/INT/BIGINT | NUMBER |
id,類型 BIGINT 防溢出UNIQUE 約束Snowflake ID、UUID 或分段號段模式掌握目標數據庫的自增語法細節,能避免遷移、同步、ORM 映射時的隱性 Bug。