2016-11-04 96 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无法完成您所要求的操作。你将不得不写一些代码或在其他答案的建议是一个很好的恕我直言。