2016-11-04 90 views
1

我想知道SQL Server(即T-SQL語言)是否有這樣做的自然方式,或者如果我必須編寫奇特的約束/觸發器。如何維護

假設我有一個表

 RebuplicanCandidates 
=================================== 
Id |  Name  | ByteIndex 
=================================== 
1 | 'Marco Rubio' | 0 
2 | 'Jeb Bush'  | 1 
3 | 'Donald Trump' | 2 
4 | 'Ted Cruz'  | 3 

,我刪除JebBush:

DELETE FROM [RepublicanCandidates] WHERE [Id]=2 

然後,我希望表像

 RebuplicanCandidates 
=================================== 
Id |  Name  | ByteIndex 
=================================== 
1 | 'Marco Rubio' | 0 
3 | 'Donald Trump' | 1 
4 | 'Ted Cruz'  | 2 

注意,ByteIndex列洗牌。

然後,如果我插入一個候選人

INSERT INTO [RepublicanCandidates] (Name) VALUES ('CarlyFiorina') 

表變得

 RebuplicanCandidates 
=================================== 
Id |  Name  | ByteIndex 
=================================== 
1 | 'Marco Rubio' | 0 
3 | 'Donald Trump' | 1 
4 | 'Ted Cruz'  | 2 
5 | 'Carly Fiorina' | 3 
+1

ehm ....插入的行發生了什麼? – Lamak

+0

@Lamak哎呀,你去吧 –

+1

爲什麼你必須存儲一個沒有間隙的ByteIndex?刪除第一行意味着表中的所有其他行都必須更新。 –

回答

4

如果你創建了一個基於該表的視圖,您可以添加一個ROW_NUMBER()函數,並刪除來自基表的ByteIndex列。

CREATE VIEW vRebuplicanCandidates 
AS 

SELECT id, name , ROW_NUMBER() OVER (ORDER BY id) - 1 AS ByteIndex 
FROM RebuplicanCandidates 
+0

但是ROW_NUMBER( )不保證任何特定順序的行。 – philipxy

0

T-SQL無法完成您所要求的操作。你將不得不寫一些代碼或在其他答案的建議是一個很好的恕我直言。