【发布时间】:2016-11-04 16:56:17
【问题描述】:
我想知道 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
【问题讨论】:
-
ehm....插入的行发生了什么?
-
@Lamak 哎呀,你去
-
为什么要存储一个没有间隙的ByteIndex?删除第一行意味着必须更新表中的所有其他行。
-
如果您基于表创建了一个视图,您可以添加一个 row_number() 函数而不是 ByteIndex 列。
-
我想知道在数据库中有一个 unstable 编号
RebuplicanCandidates[sic] 有什么价值?应用程序显示分配了密集(?!)数字的候选人可能很有用,但这是应用程序的问题。如果不保留流浪价值观的完整历史并知道何时对“14”感兴趣,您将无法返回并确定谁是“14”(以及他们是否会向您出售披萨)。
标签: sql sql-server tsql database-design