首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> SQL Server 資料庫 >> 關於SqlServer

Access / SQL Server 自動編號種子與遞增值自訂:DDL 語法、重置技巧與唯一性風險提醒

     編輯:關於SqlServer

建立資料表時指定種子與遞增

-- Access / SQL Server (ANSI 相容語法)
CREATE TABLE tblNewOrder (
    OrderId COUNTER (1000, 10) PRIMARY KEY,  -- 種子 1000, 遞增 10
    ItemId LONG,
    Quantity LONG
);

說明:`COUNTER(seed, increment)` / `AUTOINCREMENT(seed, increment)` / `IDENTITY(seed, increment)` (SQL Server 標準) 三種寫法視引擎而定。

修改現有資料表的下一個種子與遞增

-- Access
ALTER TABLE tblOrder ALTER COLUMN OrderId COUNTER (2000, 50);

-- SQL Server (標準)
DBCC CHECKIDENT ('tblOrder', RESEED, 1999); -- 下一個插入值 = 1999 + 1 = 2000
-- SQL Server 不支援 ALTER COLUMN 修改 IDENTITY 遞增值,需重建資料表或用 SEQUENCE (2012+)

重置自動編號從 1 開始 (清空資料後)

-- Access
ALTER TABLE tableName ALTER COLUMN OrderId COUNTER (1, 1);
-- VBA: DoCmd.RunSQL "ALTER TABLE tableName ALTER COLUMN OrderId COUNTER (1, 1)"

-- SQL Server
TRUNCATE TABLE tableName; -- 重置 IDENTITY 至種子值 (需無 FK 參照)
-- 或
DBCC CHECKIDENT ('tableName', RESEED, 0); -- 下一個為 1

⚠️ 唯一性風險警示 (核心陷阱)

**DDL 修改種子/遞增不保證唯一性**。

  • 例:現有資料 `1, 2, 3`,改種子為 `1`,下次插入產生 `1` → **主鍵衝突/重複**。
  • Access Jet 引擎不自動檢查現有最大值。

必做防護:

  1. 自動編號欄位**必須設為 PRIMARY KEY** 或 **UNIQUE 索引**。
  2. 修改種子前,**確認新種子 > 現有最大值** (或先清空資料 `TRUNCATE`/`DELETE`)。
  3. 生產環境**嚴禁隨意修改種子**,僅限資料遷移/重構窗口且經驗證後執行。

現代最佳實踐:SQL Server 2012+ SEQUENCE 物件

CREATE SEQUENCE dbo.OrderSeq
    AS INT
    START WITH 1000
    INCREMENT BY 10
    MINVALUE 1
    MAXVALUE 2147483647
    NO CYCLE
    CACHE 50;

-- 使用
INSERT INTO Orders (OrderId, ...) VALUES (NEXT VALUE FOR dbo.OrderSeq, ...);

優勢:獨立於資料表、可跨表共享、支援 `NEXT VALUE FOR` / `sp_sequence_get_range` 批次取號、可重設/暫停/緩存配置、解決 IDENTITY 侷限。

結語

自動編號種子遞增自訂看似簡單,**唯一性保護才是核心**。Access 用 `COUNTER` + PK/UNIQUE;SQL Server 用 `IDENTITY`/`SEQUENCE` + `DBCC CHECKIDENT` + PK。**生產庫動種子,三思而後行**。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved