2010-11-20 73 views
-4

我有一个表,其中我设置一列(N)作为“是身份”,所以它可以增加1每次我添加somthing到表。当我删除一行时,如何重新排序N?重新编号的标识列

例如,如果我在表格中添加了5个东西,N会去1,2,3,4,5。但是如果我删除第3行,N将会是1,2,4,5。我希望它自动改变值,所以N去1,2,3,4。

+5

为什么你会想重新编号标识符?如果您必须重新使用标识,则将标识符创建为聚簇索引。 – CarneyCode 2010-11-20 12:06:43

回答

0

可能这样做,但它会是一个可怕的想法。

相反,它是最好不要这个数字在所有存储在数据库中,因为数量不相关联行中的数据而是要在其中他们要检索的顺序。更好的解决方案是使用排序顺序列(允许包含空位),并在选择数据以动态生成行号时使用ROW_NUMBER。

0

可能有一种方法可以做到这一点,但是您可以选择一个tmp表格,截断原始表格并重新插入。一定要把它包装在交易中。

0

我想这会影响应用程序的性能。如果你需要重新排序每个ID,那么它应该在
1)代码方(在数据表中重新排序并提交更改)或者
2)SQL方面(通过触发器/存储过程/临时表)

9

“身份”的价值并不意味着在你的问题意义上的“反”。标识值使得每一行都是唯一的,并且不会被修改,尽管它可以被修改。如果你需要一个行计数器使它成为一个简单的int或bigint,那么使用表触发器来更新插入和删除的值。

+0

我通常不喜欢说'你做错了'的答案。我总是认为OP有他们的理由,他们应该直接回答一个直接的问题。我认为这可能是例外。 – 2010-11-20 13:20:09

+0

@IainMH,经常“你做错了”是最好的答案。当它真的是一个坏主意时,不指出它是不专业的。 – HLGEM 2010-11-23 21:01:45

0

要做你想做的事情是很多工作,然后如果你弄错了,你会遇到竞争条件,最终会导致数据完整性问题。这是一个非常想法

现在有时候客户会问这个问题,正确的做法是说:“不,这不是一个好主意,它会使您在开发和维护成本上花费更多,这会大大增加数据不匹配的风险到错误的记录,当研究过去使用过数字的事物时,它会大大增加查找与该问题无关的新记录的风险。“ (考虑重新使用订单号码,旧的Persson已经提供了这个订单号码,并且打电话询问它,但是你已经删除了它,并且其他人的订单已经到位)。并且为了所有额外的成本和风险,您获得完全没有。除了一些不想看到差距的强迫管理者外,几乎没有任何情况下你不能跳过记录。即使他们通常会在你向他们解释这个过程更可能导致错误并且花费更多的时候给予支持。大多数情况下,这是开发者自己强加的要求,除非你有一个不能被别人说服的客户,否则没有任何借口可以做到这一点。