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

SQL Server 主鍵「字母前綴+數字自增」實現方案:計算列 + 序列對象 + INSTEAD OF 觸發器

     編輯:關於SqlServer

需求分析

主鍵格式:YANJIU100000、YANJIU100001… 前綴固定,數字部分自增。
SQL Server IDENTITY 僅支援數值類型,無法直接用於字符串主鍵。

三種主流實現方案對比

方案核心機制優點缺點
計算列 + 序列 (SQL 2012+)PREFIX + RIGHT('000000'+CAST(NEXT VALUE FOR seq AS VARCHAR),6)純聲明式、無觸發器開銷、序列可跨表共享需 SQL 2012+、主鍵非原生自增
INSTEAD OF INSERT 觸發器觸發器中 SELECT MAX(CAST(SUBSTRING(id,7,6) AS INT)) + 1兼容所有版本、邏輯集中高併發需鎖表/序列化、性能較差
應用層生成 (推薦高併發)應用調用序列/Redis/雪花算法生成完整 ID 後寫入極致性能、去中心化業務邏輯下沉應用層

方案一:計算列 + 序列 完整腳本 (SQL 2012+)

-- 1. 建立序列
CREATE SEQUENCE dbo.Seq_ScientificID 
    AS INT START WITH 100000 INCREMENT BY 1 NO CYCLE;

-- 2. 建表:主鍵為計算列
CREATE TABLE dbo.ScientificA (
    ID INT NOT NULL DEFAULT NEXT VALUE FOR dbo.Seq_ScientificID,
    ScientificID AS 'YANJIU' + RIGHT('000000' + CAST(ID AS VARCHAR(6)), 6) PERSISTED PRIMARY KEY,
    ResearcherName NVARCHAR(50),
    Hospital NVARCHAR(100)
);

-- 3. 測試插入
INSERT INTO dbo.ScientificA (ResearcherName, Hospital) VALUES ('張三', '協和醫院');
INSERT INTO dbo.ScientificA (ResearcherName, Hospital) VALUES ('李四', '人民醫院');
SELECT * FROM dbo.ScientificA;

結果

IDScientificID (PK)ResearcherNameHospital
100000YANJIU100000張三協和醫院
100001YANJIU100001李四人民醫院

關鍵點提示

  • PERSISTED 使計算列物理存儲,可建索引/主鍵
  • 序列對象獨立於表,支援 CACHE 提升高併發性能
  • 若需無縫遷移舊數據,先插入歷史記錄再 ALTER SEQUENCE ... RESTART WITH <max+1>

建表界面 修改列類型界面

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