【发布时间】:2009-04-21 05:55:49
【问题描述】:
我正在一个项目中工作,其中数据库项目没有被删除,而只是被标记为已删除。像这样的:
id name deleted
--- ------- --------
1 Thingy1 0
2 Thingy2 0
3 Thingy3 0
我希望能够在 name 列上定义类似 UNIQUE 约束的内容。看起来很简单,对吧?
让我们想象一个场景,其中“Thingy3”被删除,并创建了一个新的(可能几年后)。我们得到:
id name deleted
--- ------- --------
1 Thingy1 0
2 Thingy2 0
3 Thingy3 1
...
100 Thingy3 0
从用户的角度来看,他删除了一个项目并创建了一个新项目。就像删除文件并创建新文件一样。所以对他来说很明显,新项目与旧项目相关的任何数据无关且不附加。
这已经处理好了,因为 DB 只关心 id,而且由于新项目的 id 是 100 而不是 3,所以它们完全不同。
当我想阻止用户创建另一个“Thingy3”项目时,我遇到了困难。如果我有一个 UNIQUE 约束,它只查看未标记为 deleted 的项目,那么我会解决一个问题。
(当然,我必须处理当有人撤消删除时会发生什么......)
那么,我该如何定义这种约束呢?
【问题讨论】:
-
顺便说一句,这被称为软删除databaserefactoring.com/IntroduceSoftDelete.html
-
很高兴知道这有一个名字。谢谢!
标签: sql sql-server-2005 tsql constraints