我有2個主鍵(INT,INT),想知道是否有可能有設置爲自動遞增的主鍵中的一個,而另一個不是表?以下是表結構的基礎:SQL SERVER,複合主鍵處理
Table
{
Id - Int,
VersionId - Int
}
基本上我有一個ID與版本,以便有該記錄的完整歷史記錄,併爲此可以回滾在任何時候。
我希望能夠插入和標識,併爲它然後自動處理的版本號給我。這可能嗎?
在此先感謝。
我有2個主鍵(INT,INT),想知道是否有可能有設置爲自動遞增的主鍵中的一個,而另一個不是表?以下是表結構的基礎:SQL SERVER,複合主鍵處理
Table
{
Id - Int,
VersionId - Int
}
基本上我有一個ID與版本,以便有該記錄的完整歷史記錄,併爲此可以回滾在任何時候。
我希望能夠插入和標識,併爲它然後自動處理的版本號給我。這可能嗎?
在此先感謝。
不,SQL Server沒有這樣的「分區」身份概念。如果你真的需要這個(真的??),那麼你必須以某種方式(從你的客戶端,或通過使用助手錶或類似的東西在SQL Server中自己處理它)以編程方式提供。
您可以有一個IDENTITY
字段 - 但這是整個表中連續的INT號碼 - 每個Id
都不是連續的。另一方面,由於該IDENTITY將是唯一且不斷增加的,因此您也可以將它用作版本字段(每個ID不會是1,2,3),但序列仍然存在。
在這種情況下,你可能有
ID Version
1 1
2 2
3 3
1 4
等等。
您可以創建複合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
對於超過(通過分區ID順序由版本),如從SomeTable' p_version顯示目的'選擇ID,ROW_NUMBER()可以用來獲得更直觀的版本號。 – 2010-09-15 12:39:00
對我來說看起來像一個完全有效的結構,'真正的'是什麼? – GenericTypeTea 2010-09-15 12:19:23
是的,我真的需要它,你會怎麼實現版本?感謝您的幫助,但只需要繼續在存儲過程中手動處理它:) – 2010-09-15 12:22:32
@GenericTypeTea:是的,乍一看,它看起來像一個完全有效的結構。但是:要實現這一點並且具有良好的性能非常困難 - 而且IDENTITY字段已經提供了所有這些優勢 - 對於每個單獨的ID,只是不是「1,2,3 ....」。所以這就引出了一個問題:如果另一個解決方案已經存在並且是「免費」的,那麼您需要爲每個ID連續輸入多少努力 - 只需使用它即可...... – 2010-09-15 15:15:03