索引视图在特殊约束中的应用
--环境:
IF OBJECT_ID('dbo.V1') IS NOT NULL DROP VIEW dbo.V1;
GO
IF OBJECT_ID('dbo.T1') IS NOT NULL DROP TABLE dbo.T1;
GO
CREATE TABLE dbo.T1 ( keycol INT NULL, datacol VARCHAR(10) NOT NULL );
GO
我想在keycol这个字段上建立唯一约束(注意这里的字段是可以为NULL的),这样就意味着可以插入NULL值 问题是想可以插入多列NULL值,但是UNIQUE约束会认为NULL是相等的,当你插入第二个NULL值的时候会出错。 那应该如何解决这个问题呢?下面用索引视图来解决这个问题
CREATE VIEW dbo.V1 WITH SCHEMABINDING AS
SELECT keycol FROM dbo.T1 WHERE keycol IS NOT NULL--注意这里的where 条件
GO
CREATE UNIQUE CLUSTERED INDEX idx_uc_keycol ON dbo.V1(keycol);
GO
-- 插入数据
INSERT INTO dbo.T1(keycol, datacol) VALUES(1, 'a');
INSERT INTO dbo.T1(keycol, datacol) VALUES(1, 'b'); -- 这条失败的
INSERT INTO dbo.T1(keycol, datacol) VALUES(NULL, 'c');
INSERT INTO dbo.T1(keycol, datacol) VALUES(NULL, 'd');
GO
--进行查询
SELECT keycol, datacol FROM dbo.T1;
GO
/*
keycol datacol
----------- ----------
1 a
NULL c
NULL d
*/
视图索引保证不准插入重复值,但是因为WHERE keycol IS NOT NULL 所以它没有限定NULL的重复性.