【问题标题】:Multiple Column Constraint Issue多列约束问题
【发布时间】:2012-12-13 22:27:04
【问题描述】:

我正在尝试编写一个约束,说明每个 ID 只能有一行的值为 X。

这可能没有多大意义,所以让我举个例子:

假设我在一个表中有 3 行和 2 列,每行具有相同的 ID(第 1 列),但第二列具有不同的值,其中两个相同,第三个是唯一的。如何确保唯一值保持唯一?

这是我一直在使用的约束:

ADD CONSTRAINT myConstraint UNIQUE (col1, col2);

我认为我可以将 col2 设为 NULL 并有重复项,然后在我唯一的时候使用 NOT NULL(因为我只关心单个值是否唯一)。这不起作用的原因是由于某种原因我的约束不允许重复的 NULL,几乎就像它知道如何比较 NULL...

理想情况下我想说

ADD CONSTRAINT myConstraint UNIQUE (col1, col2 = 'REQUESTED');

但类似的东西不存在。

我查看了CHECK 约束,但我不确定如何使用检查约束告诉它这样做。

基本上我想获取传入的 ID 并确保没有其他相同的 ID 的 column2 值为REQUESTED

对不起,如果这没有多大意义,我正在尽力解释这一点。

【问题讨论】:

标签: sql sql-server


【解决方案1】:

您可以使用过滤索引:http://msdn.microsoft.com/en-us/library/cc280372(v=sql.100).aspx

CREATE UNIQUE NONCLUSTERED INDEX [test_idx] ON [dbo].[test] ([col1], [col2])
WHERE ([col2] IS NOT NULL)

它是唯一索引,因此它不允许您为给定 ID(col1) 插入重复的 col2 值并用作您想要的约束。在您的情况下,您还可以使用col2 = 'REQUESTED' 过滤器。

【讨论】:

  • 这不是意味着每次向表中插入内容时都必须重新创建索引吗?
  • 如果您想保持所有 对的唯一性,其中 col2 有一个值,那么此解决方案将按原样工作,而无需重新创建索引。如果您有一组预定义的 col2 值,它们应该具有唯一的 col1 值,则使用 WHERE col2 in ('REQUESTED','REQUESTED2', 'REQUESTED3') 过滤子句。如果这个集合是动态的,那么您应该在每次添加新值时重新创建索引(如果可以的话),或者求助于基于触发器的解决方案。
猜你喜欢
  • 1970-01-01
  • 2010-12-22
  • 2021-03-12
  • 2011-07-06
  • 1970-01-01
  • 2021-11-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多