2015-10-16 77 views
1

在表格中,每次添加行时都会有一个标识列递增(最低值为1)。现在,有一项新要求 - 我们需要实施软删除。如何作弊更新标识列?

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

update Things set Id = -101 
where Id = 101 

你知道,愚蠢的电脑不让我这样做。建议的解决办法是到:

  1. 备用列
  2. 执行更新
  3. 备用回柱

,对我好像问答& D.然而,我只能看到另一种方法是添加一个带有删除状态的新列。

我正在使用EF执行额外的怪癖工作,当我改变了身份的价值和存储它,该软件是非常友好的为我思考和实际上创建一个新行(增量设置既不是原始的身份也不是负面的身份)。

我应该如何解决这个问题?

+0

您是否尝试过'SET IDENTITY_INSERT dbo.Things ON'的'UPDATE'? – stakx

+0

@stakx不,我没有。主要是因为我不知道。现在我已经做到了,但我仍然不能 - 这可能与我在Sql Server上有关。无论如何,我们会从Entity Framework那里做到这一点,我不知道如何做到这一点(或者如果可能的话)。 –

回答

8

我强烈建议您不要将任何附加含义的标识列重载。有人会首次查看数据库表,但无法知道负ID是否意味着“已删除”。

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

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

+0

'SET IDENTITY_INSERT'没有帮助,它必须在与命令相同的会话中完成,并且不适用于更新。当然,你是绝对正确的,这是一个无望的评论。打破外键甚至还没有提到。 –

+0

@Gert:感谢您的输入。关于破解外键,这可以通过“ON UPDATE CASCADE”规则来缓解(稍微)。但我同意修改主键并不是一个好主意。 – stakx