当前位置: 首页 > 面试题库 >

SQL可以在表上具有“唯一的”约束吗?

慎峻
2023-03-14
问题内容

在我的职业生涯中,我曾遇到过几次这样的问题,而我当地的同行似乎都无法回答。假设我有一个表,表中有一个“描述”字段,这是一个候选键,只是有时用户会在过程中途停下来。因此,对于25%的记录,此值是null,但对于所有非NULL的值,它必须是唯一的。

另一个示例可能是一个表,该表必须维护一条记录的多个“版本”,并且一个位值指示哪个是“活动”的。因此,总是填充“候选键”,但是可能存在三个相同的版本(活动位为0),只有一个活动版本(活动位为1)。

我有解决这些问题的替代方法(在第一种情况下,在存储过程或业务层中强制执行规则代码,在第二种情况下,用触发器填充存档表,并在需要历史记录时UNION填充表)
。我不希望有替代方法(除非有明显更好的解决方案),我只是想知道是否有任何一种SQL都可以这种方式表示“条件唯一性”。我正在使用MS
SQL,所以如果有办法做到这一点,那就太好了。我主要只是在学术上对这个问题感兴趣。


问题答案:

如果您使用的是SQL Server 2008,则索引过滤器可能是您的解决方案:

http://msdn.microsoft.com/en-
us/library/ms188783.aspx

这就是我强制具有多个NULL值的唯一索引的方法

CREATE UNIQUE INDEX [IDX_Blah] ON [tblBlah] ([MyCol]) WHERE [MyCol] IS NOT NULL


 类似资料:
  • 问题内容: 假设我们有这些表: 是否有可能在上创建唯一约束,使得对于最多一个引用中的所有行,其值都为??陈述另一种方法,我可以创建一个唯一约束,以便上述表的连接没有重复项吗?我没有考虑- 我可以找到的每个数据库的语法似乎都与每个约束都限制在一个表上- 但这可能是我缺乏想象力的原因。(当然,去规范化以包含on是一种解决方案。) 问题答案: 您可以尝试以下方法。您必须在Parent中创建一个冗余的UN

  • 问题内容: 如何在Visual Studio中直观地在varchar(max)字段上创建唯一约束。 问题是当我尝试时: 管理索引和键 >添加>列 我只能选择bigint列,而不能选择任何varchar(max)列。 我是否可能必须使用 检查约束 ? 如果是,请在表达式中添加什么? Thnx的信息 问题答案: 您不能在列上设置唯一约束(最多2 GB的文本!)。您根本无法。 唯一性约束由后台中的唯一索

  • 我有这样布局的模型: 这里的场景是我永远不希望用户删除数据。相反,删除只会隐藏记录。但是,我仍然希望所有非软删除的记录都遵循唯一的键约束。基本上,我希望有尽可能多的重复的已删除记录,但只有一个唯一的未删除记录可以存在。所以我本来想包括“已删除”字段(由django安全删除库提供),但问题是Django的唯一检查因“psycopg2”而失败。完整性错误:重复的键值违反了 ['field2', 'fi

  • 问题内容: 在一个假设的场景中,我是没有表创建特权的用户。我想知道表中的列是否具有 UNIQUE CONSTRAINT 。是否可以在 词典中 查找?我将如何处理? 问题答案: 此处给出的两个答案都缺少一种在列上实施唯一性的方法:通过创建 唯一索引 (而不在列上定义唯一约束)。如果您不熟悉此选项,请参见这两个链接(一个,两个)。 除 唯一约束检查 外 ,还应执行此检查: 要检查唯一约束,请使用已经提

  • 问题内容: 我有一张标签列表,按标签顺序显示。为了确保没有两行可以具有相同的等级,它们的值是唯一的: 不管是PostgreSQL还是MySQL,它们都表现出相同的行为。查询可能看起来像。假设该表包含: 现在,假设我想重新排序两个标签,例如Apple在Cow之前排名。最简单的方法是交换其等级值: 没有。也不: 甚至没有: 每次,唯一约束都会在第一行更新时触发,并中止该操作。如果我可以将支票推迟到帐单

  • 我对Postgres Unique约束有问题,该约束包含多个可能包含空值的列。 让我们假设这种情况: Insert将插入('foo',bar')一次和('foo',NULL)两次(尽管直觉告诉它应该插入一次)。 在这种情况下,解决方案非常简单。我可以添加唯一的索引 但是当有更多的列和不同的类型(不仅仅是文本)时,问题就开始了。假设我们有10列,其中9列可以有值。也许我可以用大量的限制来解决它,但这