首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >SQL Server组合键体验

SQL Server组合键体验
EN

Stack Overflow用户
提问于 2010-08-05 05:52:46
回答 4查看 724关注 0票数 1

我想在Documents表上创建一个组合键(这就是我的想法,但我愿意接受其他建议)。它将由两列组成,年份(2010,...)和一个ID,它将自动递增,但它应该每年重新启动。

所以像这些键2010-1,2010-2,...,2011-1,2011-2,...并且优选地,这些键还应该用于显示、打印和搜索。

虽然我不相信自动递增会起作用,因为每年都会重置,所以我想我必须自己递增,不是吗?

或者我应该创建一个varchar列,自己构造每个键,然后在该列上放置一个唯一的?

那么,我有什么选择呢?

请也考虑到未来的设计问题,我可能会有一个选择的设计,无论它是什么,易于查询。

更新:

我真的开始考虑让应用程序构造密钥并在插入时提供它。但是,这将需要在DB中查找最后发出的ID,这可能会导致大量使用时出现问题。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2010-08-05 06:24:54

将业务与数据存储结构分离是一种很好的做法。为什么?因为明天会有人决定改变业务逻辑:

  • 使用非整数文档顺序(1-AA、1-AB、1-AC...)
  • include year
  • month来构建一些月度报告并进行任何其他更改...

那么你应该做什么呢?

所以,我的解决方案是:

使用主键(例如int或您首选的数据类型)来与数据库中的其他表建立关系,并使用您想要的业务键字段(可能是某个标识符generator)

  • use
  • 字段来存储添加文档的日期,您可以计算dynamically.

的年份)来与数据库中的其他表建立关系

票数 3
EN

Stack Overflow用户

发布于 2010-08-05 05:57:20

虽然我不相信自动递增会起作用,因为每年都会重置,所以我想我必须自己递增,不是吗?

是啊。

我建议添加一个列,以便生成重置值。IDENTITY列将是最好的;DATETIME可以保存记录创建时间,但事务在3.33毫秒(0。00333秒)将具有相同的时间戳。

无论采用哪种方法,您都可以使用以下命令生成id值:

代码语言:javascript
运行
复制
SELECT (SELECT COUNT(*)
          FROM DOCUMENTS t
         WHERE t.year = d.year
           AND t.col <= d.col) AS id,
        d.year
   FROM DOCUMENTS d

或者,如果您使用的是SQL Server 2005+,您可以使用:

代码语言:javascript
运行
复制
 SELECT ROW_NUMBER() OVER (PARTITION BY d.year ORDER BY d.col) AS id,
        d.year
   FROM DOCUMENTS d
票数 1
EN

Stack Overflow用户

发布于 2010-08-05 05:58:10

为什么不添加一个实际的自动递增id呢?组合键可以很快地增长到它们实际上无用的地方-特别是出于性能原因,如果您必须在表上进行连接。如果您还想记录Document XYZ是2010年存储的第一个文档,那么仍然可以保留YearOrder (或其他)列,但主键保持整洁。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3410153

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档