索引视图在特殊约束中的应用

索引视图在特殊约束中的应用

--环境: 
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的重复性.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值