【问题标题】:How to update “row number” column values 1..N after rows are DELETED?如何在删除行后更新“行号”列值 1..N?
【发布时间】:2020-09-14 05:08:40
【问题描述】:

我有这张桌子:

当我删除此表中的一个框时,我需要对以下所有行进行增量。

例如:如果我删除 BoxNo '4' 那么 BoxNo 最后一行之后的行 '4' (5,6,7 ,..etc) 必须增加 1 并且像 (4,5,6,...etc.)。 我希望我能成功地解释这个问题。

能否请您帮我使用 SQL Server 查询来执行此操作?

提前致谢。

【问题讨论】:

  • 不要追溯更新值,使用ROW_NUMBERSELECT 时间计算它们。 SQL 表不是 Excel 工作表,当您删除它时,它们不会全部“向上”一行,表本质上是无序的。
  • 为什么要这样做?关心 id 中的空白是一个常见的陷阱。
  • 我认为更新行值同时删除其间的行不是一个好习惯。假设您的表中有 1000 条记录,如果您删除第 5 条记录,它将更新剩余的 995 条记录,这非常昂贵。请分享您重新设计的要求。
  • 文档应该是你的第一站,@Mark : ROW_NUMBER (Transact-SQL0
  • 这只是你不应该做你想做的事的一个原因,@Mark。计算运行时的值;不要存储它。想要存储这些值几乎(我的意思是几乎 99.999% 的时间)总是会推断出设计缺陷。

标签: sql sql-server row-number


【解决方案1】:

删除行后自动执行操作是TRIGGERS 的用途。

在你的情况下,它看起来像:

CREATE TRIGGER MyTable_AfterDelete
ON MyTable
FOR DELETE
AS 
update MyTable set RowCounter = RowCounter + 1
from deleted
     inner join MyTable on MyTable.BoxNo > deleted.BoxNo

GO

如您所见,SQL Server 不会在每行删除后引发触发器,而是在每个 DELETE 语句执行后引发触发器,这可能涉及删除多行,因此我们需要使用 "deleted" 伪表来应用我们的操作这些行中的每一行都已删除。

PS:这就是您所要求的可以做到的方式,尽管我同意 cmets 的说法,即您可以更好地解决这个问题,而不是在每次删除后更新这么多行。

更新

如果您想在每条删除指令上手动执行它,而不是在触发器上自动执行,您可以将 parameter 传递给 C# 上的 DELETE 语句,以更新后面的 RowCounters。比如:

delete from MyTable where BoxNo = @BoxNo

update MyTable set RowCounter = RowCounter + 1 where BoxNo > @BoxNo

【讨论】:

  • 谢谢!你能告诉我如何将它添加到我的 C# Windows 窗体应用程序中的 SqlCommand 中吗?
  • @Mark 我已经更新了答案。这是你需要知道的吗?
  • 您的编辑对我很有帮助,谢谢,我会使用它,但首先我将对我的代码进行完整的编辑,我将使用带有 SQL 查询的 if 语句,如下所示: IF新插入具有相同的 BoxNo 相同的 SSCC 相同的 StyleBarcode那么 Qty 列中的值将更新 +1 增量。像那样,我不会有非常大的行数,并且最多可以有 400-500 行,就像我认为我可以使用您上次更新的答案而不会出现 Larnu 指出的设计缺陷(我希望)。坦率地说,我还不知道该怎么做,但我会试一试。
  • @Mark 如果您遇到困难,请发布新问题,我们会尽力帮助您。
  • 我确实做到了,最终使用了 MERGE 语句。谢谢。
猜你喜欢
  • 1970-01-01
  • 2023-02-10
  • 1970-01-01
  • 1970-01-01
  • 2014-10-10
  • 2022-11-04
  • 1970-01-01
  • 1970-01-01
  • 2018-09-06
相关资源
最近更新 更多