重新编号标识列

时间:2010-11-20 12:03:05

标签: c# sql database identity

我有一个表格,我将一列(N)设置为“is identity”,因此每当我向表中添加一些内容时,它都可以递增1。当我删除一行时,如何重新排序N?

例如,如果我向表中添加了5个内容,则N将为1,2,3,4,5。但如果我删除第3行,N将是1,2,4,5。我希望它自动更改值,使其N变为1,2,3,4。

5 个答案:

答案 0 :(得分:9)

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

答案 1 :(得分:0)

可以做到这一点,但这将是可怕的想法。

相反,最好不要将此号码存储在数据库中,因为该号码与行中的数据无关,而是与您在其中的订单相关联希望他们被检索。更好的解决方案是使用排序顺序列(允许包含间隙),并在选择数据时动态生成行号使用ROW_NUMBER。

答案 2 :(得分:0)

可能有一种方法可以做到这一点,但您可以选择进入tmp表,截断原始表并重新插入。务必将其包装在交易中。

答案 3 :(得分:0)

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

答案 4 :(得分:0)

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

现在客户偶尔要求这样做,并且正确的行动是说,“不,这是一个坏主意。它会使您在开发和维护成本上花费更多,这将大大增加您使数据不匹配的风险错误的记录会大大增加你在研究过去使用过这个数字的东西时查找与问题无关的新记录的风险。“ (例如,考虑重新使用订单号,旧的persson已经提供了这个订单号,然后打电话询问它,但是你删除了它,其他人的订单就在它的位置。)并且为了所有额外的成本和风险,你获得了什么都没有。几乎没有任何情况下你真的不能跳过记录,除了一些不想看到差距的强迫性经理。一旦你向他们解释这个过程更有可能导致错误并且成本会更高,他们通常会放弃。大部分时间这是开发人员自我强加的要求,除非你有一个不能被说服的客户,否则没有任何借口可以做到这一点。