身分識別欄位是 SQL Server 實現自動遞增主鍵的核心機制。本文系統整理圖形化建立、DDL 語法、種子重置、ALTER TABLE 修改限制、Access 對比,並提供跨平台自增語法對照表。
id 欄位(int 型別)。CREATE TABLE MyTable (
ID INT IDENTITY(1,1) NOT NULL PRIMARY KEY, -- 種子=1, 遞增=1
Col1 VARCHAR(50),
Col2 DATETIME
);
語法:IDENTITY(seed, increment)
-- Access 專用
CREATE TABLE MyTable (
ID COUNTER(1000, 10) PRIMARY KEY, -- 起始 1000, 步長 10
Col1 VARCHAR(50)
);
-- 修改 Access 自增種子/步長
ALTER TABLE MyTable ALTER COLUMN ID COUNTER(2000, 50);
-- 重置空表 Access 自增從 1 開始
ALTER TABLE MyTable ALTER COLUMN ID COUNTER(1, 1);
警告:SQL Server 不支援 COUNTER、AUTOINCREMENT、ALTER COLUMN ... COUNTER 語法。
許多開發者嘗試:
-- 錯誤嘗試
ALTER TABLE MyTable ALTER COLUMN ID IDENTITY(1,1); -- 語法錯誤
原因:IDENTITY 屬性只能在 中定義(即 CREATE TABLE 或 ALTER TABLE ADD 時),不能在 ALTER COLUMN 中新增或修改。
ALTER TABLE MyTable ADD NewID INT IDENTITY(1,1);
-- 下一筆插入從 101 開始
DBCC CHECKIDENT ('MyTable', RESEED, 100);
-- 重置為 1(表必須為空或 TRUNCATE 後)
TRUNCATE TABLE MyTable;
DBCC CHECKIDENT ('MyTable', RESEED, 0); -- 下一筆為 1
| 資料庫 | 語法 | 重置種子 |
|---|---|---|
| SQL Server | IDENTITY(1,1) | DBCC CHECKIDENT('t', RESEED, n) |
| MySQL | AUTO_INCREMENT | ALTER TABLE t AUTO_INCREMENT = n |
| Oracle 12c+ | GENERATED AS IDENTITY | ALTER TABLE t MODIFY id GENERATED AS IDENTITY (START WITH n) |
| Oracle 11g- | Sequence + Trigger | Drop/Recreate Sequence |
| PostgreSQL | GENERATED AS IDENTITY / SERIAL | ALTER SEQUENCE t_id_seq RESTART WITH n |
| SQLite | INTEGER PRIMARY KEY AUTOINCREMENT | DELETE FROM sqlite_sequence WHERE name='t'; |
| Access | COUNTER(seed, step) / AUTOINCREMENT | ALTER TABLE t ALTER COLUMN id COUNTER(n, step) |
NOT FOR REPLICATION 避免訂閱端產生衝突值。IDENTITY_INSERT ON 批次指定值,或使用 Sequence (SQL 2012+) 取號後批次寫入。BIGINT (922京) 而非 INT (21億),避免溢位重構。SQL Server 的 IDENTITY 功能強大但限制明確:只能在建表或 ADD COLUMN 時定義,無法 ALTER COLUMN 追加。掌握 DBCC CHECKIDENT 種子重置、跨平台語法差異、複寫與大數據場景的最佳實踐,即可靈活駕馭自增主鍵設計。