如何欺骗更新身份列?
How to cheatedly update identity column?
在 table 中,每添加一行,标识列就会递增 1(最小值是 1)。现在,有一个新需求——我们需要实现软删除。
所以,我的想法基本上是将任何软删除的行乘以 -1。这确保了唯一性并清楚地在活动和软删除项目之间划清界限。
update Things set Id = -101
where Id = 101
你知道吗,愚蠢的电脑不允许我那样做。建议的解决方法是:
- 交替列
- 执行更新
- 换回列
对我来说,这似乎是一个 Q&D。但是,我能看到的唯一选择是添加一个带有删除状态的新列。
我正在使用 EF 执行工作,但有一个额外的怪癖,即当我更改标识的值并存储它时,该软件非常友好地为我思考并且实际上 create 一个新行(增量设置的标识既不是原始标识也不是它的负标识)。
我该如何解决这个问题?
我强烈建议您不要在标识栏中添加任何额外的含义。第一次查看您的数据库 table 的人无法知道负 ID 表示 "deleted".
引入新专栏Deleted BIT NOT NULL DEFAULT 0
就没有这个缺点了。这是不言自明的。而且它几乎不需要任何费用:在大数据时代,额外的 BIT
列不会填满您的硬盘。
综上所述,如果您仍然想这样做,可以尝试 SET IDENTITY_INSERT dbo.Things ON
,然后再 UPDATE
。 (不过,我目前无法验证这是否可行。)
在 table 中,每添加一行,标识列就会递增 1(最小值是 1)。现在,有一个新需求——我们需要实现软删除。
所以,我的想法基本上是将任何软删除的行乘以 -1。这确保了唯一性并清楚地在活动和软删除项目之间划清界限。
update Things set Id = -101
where Id = 101
你知道吗,愚蠢的电脑不允许我那样做。建议的解决方法是:
- 交替列
- 执行更新
- 换回列
对我来说,这似乎是一个 Q&D。但是,我能看到的唯一选择是添加一个带有删除状态的新列。
我正在使用 EF 执行工作,但有一个额外的怪癖,即当我更改标识的值并存储它时,该软件非常友好地为我思考并且实际上 create 一个新行(增量设置的标识既不是原始标识也不是它的负标识)。
我该如何解决这个问题?
我强烈建议您不要在标识栏中添加任何额外的含义。第一次查看您的数据库 table 的人无法知道负 ID 表示 "deleted".
引入新专栏Deleted BIT NOT NULL DEFAULT 0
就没有这个缺点了。这是不言自明的。而且它几乎不需要任何费用:在大数据时代,额外的 BIT
列不会填满您的硬盘。
综上所述,如果您仍然想这样做,可以尝试 SET IDENTITY_INSERT dbo.Things ON
,然后再 UPDATE
。 (不过,我目前无法验证这是否可行。)