【问题标题】:SQL Unique ConstraintSQL 唯一约束
【发布时间】:2011-09-12 20:10:16
【问题描述】:

我有一个表Person,其中包含Code(varchar)Name(varchar)Active(bit) 字段。当我搜索 Person 时,只返回活动记录,而当我删除 Person 时,我设置了 Active = false,这样它就不会出现在我的搜索中。

问题是我在CodeName 字段上添加了唯一约束,因此每个Person 只能有一个。现在问题是用户在搜索中看不到Person(因为他们的活动是假的)并尝试添加相同的Person,但唯一约束阻止他们这样做。

有没有办法保持唯一约束,并可能添加一个检查到Active,这样我仍然可以添加那个Person,如果它以前设置为active = false?我知道这里的简单解决方案是完全删除记录,但出于数据目的,我需要保留记录而不是删除它,因此只设置active = false

谢谢

【问题讨论】:

  • 为什么不把存档数据移到分隔存档表?
  • 您能否修改您的约束以包括CodeNameActive
  • @Yuck:它将防止多个code+name处于已删除状态(这仍然是完全有效的情况)
  • @zerkms:对我来说,即使他们已被删除,他们仍然是同一个人。如果允许的话,这听起来像是Person 表中的重复数据。
  • @Yuck:它们是存档记录。我不认为每个人都有几个过时的行是重复的。它只会在某些事情发生变化时发生。

标签: sql constraints


【解决方案1】:

没有。如果您对一个(或多个)字段应用唯一约束,则可以防止它出现任何重复数据。

理论上,您可以对所有三个字段应用唯一约束,但是如果同一个人存在于表中并且已经被“删除”(具有活动集),这将阻止您“删除”一个人为假)。

如果您担心,我会亲自存档数据,而不是使用“活动”字段。创建一个新表并在其中插入删除以保存数据并将它们从现有的“Person”表中删除。

【讨论】:

    【解决方案2】:

    怎么样...

    删除约束,并对表进行计数。在插入之前只对表做个计数,确保没有重复记录。

    亲切的问候

    【讨论】:

    • 在这种情况下,您需要锁定整个表以获得一致的状态,否则您将遇到竞争条件问题。
    • 正如您在 2 分钟前所说,该表可能一次最多包含 200 条记录。
    猜你喜欢
    • 2021-07-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-01
    • 2011-02-17
    相关资源
    最近更新 更多