主鍵格式: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 後寫入 | 極致性能、去中心化 | 業務邏輯下沉應用層 |
-- 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;
| ID | ScientificID (PK) | ResearcherName | Hospital |
|---|---|---|---|
| 100000 | YANJIU100000 | 張三 | 協和醫院 |
| 100001 | YANJIU100001 | 李四 | 人民醫院 |
PERSISTED 使計算列物理存儲,可建索引/主鍵CACHE 提升高併發性能ALTER SEQUENCE ... RESTART WITH <max+1>
