典型主從表場景:
四大痛點:
ON t1.bill_no = t2.bill_no AND t1.item_cd = t2.item_cd AND t1.price_type = t2.price_typeOFFSET/FETCH 或 ROW_NUMBER() 需穩定排序,複合鍵排序邏輯複雜且易發生重複/遺漏為每張表新增 無業務含義的數值型單欄主鍵(Surrogate Key / Proxy Key)。
CREATE TABLE T_PK_DEMO (
U_ID BIGINT NOT NULL, -- 代理鍵
COL_OTHER VARCHAR(20) NOT NULL, -- 業務欄位
CONSTRAINT PK_T_PK_DEMO PRIMARY KEY NONCLUSTERED (U_ID)
);
IDENTITY 痛點:
SCOPE_IDENTITY())推薦:序列器模式 — 參考 Oracle Sequence,自建號碼發號表:
CREATE TABLE dbo.SeqGenerator (
SeqName VARCHAR(50) PRIMARY KEY,
NextVal BIGINT NOT NULL,
IncrementVal INT NOT NULL DEFAULT 1
);
-- 取號存儲程序
CREATE PROC dbo.sp_GetNextSeq @SeqName VARCHAR(50), @NextVal BIGINT OUTPUT
AS
BEGIN
UPDATE dbo.SeqGenerator SET @NextVal = NextVal, NextVal = NextVal + IncrementVal
WHERE SeqName = @SeqName;
IF @@ROWCOUNT = 0 RAISERROR('Sequence not found', 16, 1);
END
優勢:應用層可預先取號、支援分段分配(避免熱點)、跨資料庫合併無衝突、復原/匯入完全可控。
ID BIGINT PRIMARY KEY,叢集索引建於此欄(窄、遞增、靜態)UNIQUE (BillNo, ItemCd) 保證業務唯一性ParentID BIGINT REFERENCES Parent(ID)ORDER BY ID OFFSET @skip ROWS FETCH NEXT @page ROWS ONLYISO_Country_Code CHAR(2))且極穩定