2010-09-15 86 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