2015-10-16 53 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