在列上创建约束,但仅限于部分数据

时间:2016-10-26 14:35:17

标签: sql sql-server sql-server-2012

我想在列上创建约束,但仅限于部分数据。

情况如下:我们在一个表中拥有所有下拉列表的所有值。为了将它们分开,我们有一个名为dropdowntype的鉴别器。

现在我想创建一个约束,但必须考虑dropdowntype

约束条件是:下拉列表可以具有默认值。每个dropdowntype只允许零个或一个记录,true的值为isdefault

因此true可能存在多个值为isdefault的记录,但它们对dropdowntype的值都应该不同。

编辑:但是,给定dropdowntype允许值为false的多个值。

这可能吗?

(然后作为奖励,我还想在另一个nullable列上设置约束,该列的所有值都为null或具有值,对于给定的dropdowntype也是如此。但也许当第一个问题得到解答时,我会弄清楚如何自己做这个。)

表:

CREATE TABLE [dbo].[DropDownValues](

    [Id] [int] IDENTITY(1,1) NOT NULL,
    [Name] [nvarchar](100) NOT NULL,
    [CreateDate] [datetime] NOT NULL,
    [IsActive] [bit] NOT NULL,
    [IsDefaultValue] [bit] NOT NULL,
    [Description] [nvarchar](1000) NULL,
    [IsOtherItem] [bit] NOT NULL,
    [Dropdowntype] [tinyint] NOT NULL,
 CONSTRAINT [PK_ddv] PRIMARY KEY CLUSTERED 
(
    [Id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]

1 个答案:

答案 0 :(得分:2)

要回答问题1,您需要dropdowntypeisdefault上的复合唯一键。伪代码:

CREATE UNIQUE NONCLUSTERED INDEX idx_yourcolumn_notnull
ON YourTable(dropdowntype, isdefault)
WHERE isdefault IS NOT NULL;

你可以在问题的第二部分做同样的事情。它们的关键是 WHERE isDefault IS NOT NULL ,它允许您在可空列上创建唯一约束。