如何欺骗性更新标识栏?

Kon*_*ten 1 c# sql identity entity-framework

在表中,每次添加行时都会有一个标识列递增1(最低值为1).现在,有一个新的要求 - 我们需要实现软删除.

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

update Things set Id = -101
where Id = 101
Run Code Online (Sandbox Code Playgroud)

你知道吗,这台愚蠢的电脑让我不这么做.建议的解决方法是:

  1. 列交替
  2. 执行更新
  3. 交替回到专栏

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

我正在使用EF来执行额外的工作,当我更改身份的值并存储它时,软件非常友好地为我思考并实际创建一个新行(具有增量设置的身份,既不是原始的,也不是消极的).

我该如何解决这个问题?

sta*_*ica 8

我强烈建议您不要使用任何其他含义来超载您的标识栏.第一次查看数据库表的人无法知道否定ID意味着"已删除".

引入新列Deleted BIT NOT NULL DEFAULT 0没有这个缺点.这是不言自明的.它的成本几乎为零:在大数据时代,额外的BIT列不会填满你的硬盘.

所有这一切,如果你仍然想这样做,你可以尝试SET IDENTITY_INSERT dbo.Things ON在你之前UPDATE.(但我目前无法验证这是否可行.)