Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/292.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 为标识列重新编号_C#_Sql_Database_Identity - Fatal编程技术网

C# 为标识列重新编号

C# 为标识列重新编号,c#,sql,database,identity,C#,Sql,Database,Identity,我有一个表,其中我将一列N设置为is标识,这样每当我向表中添加某个内容时,它就可以增加1。当我删除一行时,如何重新排序N 例如,如果我在表中添加5个元素,N将变成1,2,3,4,5。但是如果我删除第3行,N将是1,2,4,5。我希望它能自动改变值,使N变为1,2,3,4。你可以这样做,但这是个糟糕的主意 相反,最好不要将该数字存储在数据库中,因为该数字与行中的数据无关,而是与您希望检索它们的顺序相关。更好的解决方案是使用允许包含间隙的排序顺序列,并在选择数据以动态生成行号时使用ROW_NUMBE

我有一个表,其中我将一列N设置为is标识,这样每当我向表中添加某个内容时,它就可以增加1。当我删除一行时,如何重新排序N

例如,如果我在表中添加5个元素,N将变成1,2,3,4,5。但是如果我删除第3行,N将是1,2,4,5。我希望它能自动改变值,使N变为1,2,3,4。

你可以这样做,但这是个糟糕的主意


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

可能有一种很好的方法来实现这一点,但您可以选择tmp表,截断原始表并重新插入。请务必将其包装在事务中。

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

标识值在您的问题中并不意味着是计数器。标识值使每一行都是唯一的,虽然可以更改,但不打算对其进行修改。如果需要行计数器,请将其设置为简单的int或bigint,然后使用表触发器更新插入和删除时的值。

要完成所需的操作需要大量的工作,如果操作错误,则会出现争用条件,最终会造成数据完整性问题。这是一个非常糟糕的想法


现在,客户偶尔会要求这样做,正确的做法是说,不,这是个坏主意。这将大大增加您的开发和维护成本,大大增加您的数据与错误记录不匹配的风险,并大大增加您在研究以前使用该数字的内容时查找与问题无关的新记录的风险。考虑重用订单号例如,老员工已收到此订单号,并打电话询问,但您将其删除,其他人的订单已到位。尽管有这些额外的成本和风险,你却一无所获。几乎没有任何情况下你真的不能跳过记录,除了少数强迫性的经理不想看到差距。即使是他们通常也会在你向他们解释这个过程更有可能导致错误并且成本会大大增加时让步。大多数情况下,这是开发人员自我强加的要求,没有任何借口可以这样做,除非您有一个无法被说服的客户

为什么要对标识符重新编号?如果您必须重用标识,那么就将标识创建为聚集索引。我通常不喜欢回答“您做错了”。我总是认为OP有他们的理由,他们应该直接回答一个直接的问题。我想这可能是个例外。@IainMH,通常你做错了才是最好的答案。当它真的是一个坏主意时,不指出它是不专业的。