Sql server 主键(两列)标识增量

Sql server 主键(两列)标识增量,sql-server,database-design,ddl,seed,Sql Server,Database Design,Ddl,Seed,我的主键中有两列(id,type),id是identity,type是外键。 我想为id列设置种子,如下所示: id type 10000 1 10001 1 10000 2 10001 2 10002 1 10002 2 10000 3 我可以从代码(或dml)中实现这一点,但我想知道在ddl或SqlServer表属性中是否可能实现这一点?id列每行递增1。没有办法让它重复。为什么不能将标识符列作为表的主键?您可能需要使用触发器来执行此操作 Microso

我的主键中有两列(id,type),id是identity,type是外键。 我想为id列设置种子,如下所示:

 id    type
10000   1
10001   1
10000   2
10001   2
10002   1
10002   2
10000   3

我可以从代码(或dml)中实现这一点,但我想知道在ddl或SqlServer表属性中是否可能实现这一点?

id列每行递增1。没有办法让它重复。为什么不能将标识符列作为表的主键?您可能需要使用触发器来执行此操作

Microsoft SQL Server不允许您通过TSQL很容易地在现有列上添加或更改标识。若要更改原始种子值并对任何现有行重新设定种子,必须删除标识列并指定新种子值重新创建它。当表包含数据时,将使用指定的种子值和增量值将标识号添加到现有行中

你对使用触发器有一些限制吗?如果不是,您可以使用一个而不是标识列。在单个类型中,是否允许序列中存在间隙?当前版本的SQL Server确实不支持此功能,但使用SQL Server 2012(“Denali”),您将能够在数据库中创建
序列
对象,这将是完美的-他们分发顺序号,完全独立于任何其他DB对象。@marc_s我不确定顺序是否适用于此特定目的。对于OP,您需要为10000、10001、10002等中的每一个创建序列,这是不切实际的。您将无法仅从一个序列甚至一组序列中填充type列。每次id列增加时,您都需要创建一个新的id列。原因是:嗯,我和我的团队就这个问题进行了争论。该组织有几种发票类型(进货、进货自有成本、进货预付款等-法律禁止)。在大约20年的时间里,每个类型编号都以相同的编号开始,我不确定是否要更改。不清楚您是否有更改表结构的灵活性,但在这种情况下,我始终主张使用代理键,如InvoiceId作为标识列,然后使用另一列作为自然键。在本例中,自然键可以是InvoiceNo,它是id+类型字段的组合(例如10001-210003-1)。您仍然可以为type使用单独的列。如果您这样设置,那么业务部门是否改变了对如何生成发票号码的想法并不重要。闻起来像是规范化/数据库设计问题。应该有发票表和发票类型表。虽然发票可以有一个类型列,但它可能不需要是pk的一部分+1代表关键建议客户。这就是在数据仓库中处理这些问题的方式。为代理项键创建一个新的标识列,并对旧的id和类型列设置一个唯一约束。@ClintGood-如果我理解,您建议如下:InvoiceId标识、自然主义者id(InvoiceId+类型)、类型FK?在这种情况下,我不允许将例如10001-2和10001-3作为自然主义进程ID。也许我应该独立于InvoiceId设置naturalnvoiceid(取决于类型的增量last naturalnvoiceid)。在您的情况下,您可能需要一个复合自然键。在这种情况下,我同意您应该独立于InvoiceId设置NatalInVoiceId。