首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計疑難解答

SQL Server 2012 自動編號列(IDENTITY)創建指南

     編輯:程式設計疑難解答

主流數據庫自增主鍵語法對比與最佳實踐

原問題針對 SQL Server 2012,但最佳回答給出的是 MySQL 語法。本文針對各主流數據庫給出正確的自增列定義方式。

SQL Server 2012 (T-SQL)


CREATE TABLE 選課表 (
    id INT IDENTITY(1,1) NOT NULL,  -- 種子 1,增量 1
    Num INT NOT NULL,
    -- 其他列...
    CONSTRAINT PK_選課表 PRIMARY KEY (id)
);
  • IDENTITY(1,1):起始值 1,每次遞增 1
  • 不需顯式 NOT NULL,IDENTITY 隱含非空
  • 僅允許一個 IDENTITY 列
  • 插入時不可顯式指定值(除非 SET IDENTITY_INSERT ON)

MySQL / MariaDB


CREATE TABLE 選課表 (
    id INT NOT NULL AUTO_INCREMENT,
    Num INT NOT NULL,
    PRIMARY KEY (id)
);

PostgreSQL


-- 現代語法 (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
);

Oracle (12c+)


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;

SQLite


CREATE TABLE 選課表 (
    id INTEGER PRIMARY KEY AUTOINCREMENT,  -- 或僅 INTEGER PRIMARY KEY
    Num INTEGER NOT NULL
);

關鍵差異對比表

特性SQL ServerMySQLPostgreSQLOracle
語法關鍵字IDENTITYAUTO_INCREMENTGENERATED AS IDENTITY / SERIALGENERATED AS IDENTITY
指定種子/增量IDENTITY(100,10)不支持 (需 ALTER TABLE AUTO_INCREMENT=100)START WITH 100 INCREMENT BY 10START WITH 100 INCREMENT BY 10
允許顯式插入SET IDENTITY_INSERT ON允許 (需 0/NULL)OVERRIDING SYSTEM VALUEOVERRIDING SYSTEM VALUE
獲取新 IDSCOPE_IDENTITY()LAST_INSERT_ID()RETURNING id / currval()RETURNING id INTO :var
類型要求整數類型整數類型SMALLINT/INT/BIGINTNUMBER

最佳實踐建議

  • 統一命名:主鍵列統一命名為 id,類型 BIGINT 防溢出
  • 避免業務含義:自增 ID 僅作技術主鍵,業務唯一性用 UNIQUE 約束
  • 分庫分表預留:分布式場景考慮 Snowflake ID、UUID 或分段號段模式
  • 遷移腳本:使用 Flyway/Liquibase 管理版本,跨數據庫遷移時自動轉換語法

掌握目標數據庫的自增語法細節,能避免遷移、同步、ORM 映射時的隱性 Bug。

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