2010-07-15 53 views
5

如何在SQL Server 2005/2008中使用以下格式創建主鍵: CurrentYear + auto-increment基於年份的主鍵?

示例:當前年份爲2010年,在新表格中,ID應從1開始,例如:20101,20102,20103,20104,20105 ...等等。

+0

序列+觸發器 – BenV 2010-07-15 14:34:08

+0

你不能簡單地設置身份se ed初始值爲20100? – Kane 2010-07-15 14:35:21

+0

@Kane 2010年9月之後這種方式,將達到20110年! – BrunoSalvino 2010-07-15 14:38:34

回答

2

這在技術上滿足需求你要求的:

CREATE TABLE #test 
     (seeded_column INT IDENTITY(1,1) NOT NULL 
     , year_column INT NOT NULL DEFAULT(YEAR(GETDATE())) 
     , calculated_column AS CONVERT(BIGINT, CONVERT(CHAR(4), year_column, 120) + CONVERT(VARCHAR(MAX), seeded_column)) PERSISTED PRIMARY KEY 
     , test VARCHAR(MAX) NOT NULL); 

INSERT INTO #test (test) 
SELECT 'Badda' 
UNION ALL 
SELECT 'Cadda' 
UNION ALL 
SELECT 'Dadda' 
UNION ALL 
SELECT 'Fadda' 
UNION ALL 
SELECT 'Gadda' 
UNION ALL 
SELECT 'Hadda' 
UNION ALL 
SELECT 'Jadda' 
UNION ALL 
SELECT 'Kadda' 
UNION ALL 
SELECT 'Ladda' 
UNION ALL 
SELECT 'Madda' 
UNION ALL 
SELECT 'Nadda' 
UNION ALL 
SELECT 'Padda'; 

SELECT * 
FROM #test; 

DROP TABLE #test; 
+0

這是@Pontus Gagge提出的解決方案的實現嗎? – BrunoSalvino 2010-07-15 15:06:31

+0

編號@Pontus Gagge建議在兩列中創建一個複合索引,而不是從兩列導出的計算列。 – 2010-07-15 15:12:05

+0

不太好,但如果你真的想直接實現你的YEAR + COUNTER鍵,這是一個有趣的選擇。我會仔細研究SQL Server是否像處理組合鍵一樣有效地處理主鍵的計算列。我的直覺是,你將會受到重大的性能影響。 – 2010-07-15 15:12:50

9

cleaner solution將創建一個composite primary key由例如, YearCounter列。

+1

+1用於保持類型不同,但我不清楚爲什麼包括一年是必要的。 – 2010-07-15 14:49:27

+0

我的假設是密鑰將對最終用戶可見(如訂單編號方案)。否則,我會推薦一個純合成密鑰。 – 2010-07-15 15:13:49

3

不確定你正在努力完成的工作,但這樣做有兩個字段更有意義。

如果兩者的組合因爲某些原因必須是PK,那麼就跨越兩列。然而,由於身份部分將獨一無二,因此似乎沒有必要。

0

你必須寫一個觸發這個:)

具有用於存儲最近使用的數字一個單獨的表(我真的不知道是否有在SQL Server類似序列東西在甲骨文)。

OR

你可以得到最後一個項目插入項目,並提取了它的最後一個號碼。

THEN

你可以得到當前年份SELECT DATEPART(yyyy,GetDate());

觸發將是一個ON INSERT觸發,你結合的年份和最後一位數字和更新列