2010-09-15 88 views
1

我有2个主键(INT,INT),想知道是否有可能有设置为自动递增的主键中的一个,而另一个不是表?以下是表结构的基础:SQL SERVER,复合主键处理

Table 
{ 
    Id - Int, 
    VersionId - Int 
} 

基本上我有一个ID与版本,以便有该记录的完整历史记录,并为此可以回滚在任何时候。

我希望能够插入和标识,并为它然后自动处理的版本号给我。这可能吗?

在此先感谢。

回答

2

不,SQL Server没有这样的“分区”身份概念。如果你真的需要这个(真的??),那么你必须以某种方式(从你的客户端,或通过使用助手表或类似的东西在SQL Server中自己处理它)以编程方式提供。

您可以有一个IDENTITY字段 - 但这是整个表中连续的INT号码 - 每个Id都不是连续的。另一方面,由于该IDENTITY将是唯一且不断增加的,因此您也可以将它用作版本字段(每个ID不会是1,2,3),但序列仍然存在。

在这种情况下,你可能有

ID Version 
1  1 
2  2 
3  3 
1  4 

等等。

+0

对我来说看起来像一个完全有效的结构,'真正的'是什么? – GenericTypeTea 2010-09-15 12:19:23

+0

是的,我真的需要它,你会怎么实现版本?感谢您的帮助,但只需要继续在存储过程中手动处理它:) – 2010-09-15 12:22:32

+0

@GenericTypeTea:是的,乍一看,它看起来像一个完全有效的结构。但是:要实现这一点并且具有良好的性能非常困难 - 而且IDENTITY字段已经提供了所有这些优势 - 对于每个单独的ID,只是不是“1,2,3 ....”。所以这就引出了一个问题:如果另一个解决方案已经存在并且是“免费”的,那么您需要为每个ID连续输入多少努力 - 只需使用它即可...... – 2010-09-15 15:15:03

2

您可以创建复合PK,但像您期望的版本递增将无法正常工作 - 这将是连续的,而不是“复位”第1版对每一个新的ID

create table SomeTable 
(
    id int not null, 
    version int identity(1,1) not null, 
    primary key(id, version) 
) 

insert into SomeTable(id) values (1234) 
insert into SomeTable(id) values (1235) 
insert into SomeTable(id) values (1234) 

select * from SomeTable 

返回

1234 1 
1235 2 
1234 3 

etc

+2

对于超过(通过分区ID顺序由版本),如从SomeTable' p_version显示目的'选择ID,ROW_NUMBER()可以用来获得更直观的版本号。 – 2010-09-15 12:39:00