2011-02-17 69 views
2

我有一個通過父主鍵與父項關聯的子表。目前,子表的標準ID爲int IDENTITY(1,1)。這對我的目的來說很好,不會改變,但對用戶來說,當他們查看與父級關聯的子行時,他們將看到脫節ID的列表。用於記錄組的標識自動遞增ID

我想有一個顯示ID從1開始,併爲每組記錄增量(如標識列)。

我的孩子表看起來像這樣;

ChildID-PK ParentID-FK DisplayID 
1   1   1 
2   1   2 
3   2   1 
4   3   1 
5   1   3 

可能的解決方案;

  • 插入記錄時,使用SELECT MAX(DisplayID) + 1 FROM tbl WHERE ParentID = @ParentID作爲新記錄的DisplayID。如果很多人一次編輯一組記錄,我可以看到這是有問題的。
  • 使用ROW_NUMBER()可以獲取DisplayID,但在這種情況下,如果記錄被刪除,現有記錄的DisplayID可能會更改。這不會發生,因爲用戶在輸入數據時可能會引用特定的DisplayID。
+0

如果它僅用於顯示目的,當查詢特定ParentID的記錄時,是否可以通過ChildID子句的順序使用row_number()? – mellamokb 2011-02-17 15:36:31

+0

問題在於如果中間的一行被刪除,我不希望顯示ID改變。用戶可以指的是「孩子4」,但是明天當「孩子3」被刪除時,「孩子4」變成「孩子3」。 – 2011-02-17 15:42:17

回答

0

我能想到的最安全的方式是創建類似於Oracle序列對象的東西。在這個Microsoft SQL Server Development Customer Advisory Team blog post中有一個很好的例子(我更喜歡選項2)。

你應該爲每一個插入父行順序:

EXEC usp_CreateNewSeq N'ParentSeq' + @parentId 

,並得到各行的下一個序列中的關聯表:

INSERT INTO [table] VALUES (@childId, @parentId, EXEC 'GetNewSeqVal_'+ @parentId) 

我不知道我的語法我無法檢查它,所以隨時糾正我。


簡單的方法:列添加到父表的默認值稱爲MaxChildId = 0每次添加一個子行,你應該更新此列,並使用其新的價值爲DisplayID

declare @vid int 

UPDATE [ParentTable] 
SET @vid = MaxChildId+1, MaxChildId = MaxChildId+1 
WHERE Id = ParentID 
select @vid 

此方法在更新父表時可能會導致併發。


畢竟有人說,我認爲你最好考慮重新設計來解決這個問題。