2010-07-15 75 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触发,你结合的年份和最后一位数字和更新列