如何欺骗更新身份列?

How to cheatedly update identity column?

在 table 中,每添加一行,标识列就会递增 1(最小值是 1)。现在,有一个新需求——我们需要实现软删除。

所以,我的想法基本上是将任何软删除的行乘以 -1。这确保了唯一性并清楚地在活动和软删除项目之间划清界限。

update Things set Id = -101
where Id = 101

你知道吗,愚蠢的电脑不允许我那样做。建议的解决方法是:

  1. 交替列
  2. 执行更新
  3. 换回列

对我来说,这似乎是一个 Q&D。但是,我能看到的唯一选择是添加一个带有删除状态的新列。

我正在使用 EF 执行工作,但有一个额外的怪癖,即当我更改标识的值并存储它时,该软件非常友好地为我思考并且实际上 create 一个新行(增量设置的标识既不是原始标识也不是它的负标识)。

我该如何解决这个问题?

我强烈建议您不要在标识栏中添加任何额外的含义。第一次查看您的数据库 table 的人无法知道负 ID 表示 "deleted".

引入新专栏Deleted BIT NOT NULL DEFAULT 0就没有这个缺点了。这是不言自明的。而且它几乎不需要任何费用:在大数据时代,额外的 BIT 列不会填满您的硬盘。

综上所述,如果您仍然想这样做,可以尝试 SET IDENTITY_INSERT dbo.Things ON,然后再 UPDATE。 (不过,我目前无法验证这是否可行。)