筛选索引简单使用

[size=large]对于在强制实施数据完整性时的一种常见需求,也可以用筛选索引来解决。出于强制唯一性的目的,SQL Server支持的UNIQUE约束认为两个NULL是相等的,这意味着,如果在一个允许为NULL的列上定义了一个UNIQUE约束,那么这个列上就只能有一行可以为NULL。但在一些情况下,可能只需要对非NULL值强制实施唯一性约束,允许存在多个NULL值。ANSI SQL确实支持这种UNIQUE约束,但SQL SERVER还从未实施过这种约束。现在,有了筛选索引,这种需求解决起来也不难。只要创建一个唯一的筛选索引,将其筛选谓词定义为WHERE<列>IS NOT NULL。例如,运行以下代码,创建一个T1表,并在它的COLL列 定义一个这样的筛选索引:[/size]
IF OBJECT_ID('dbo.T1', 'U') IS NOT NULL DROP TABLE dbo.T1;
CREATE TABLE dbo.T1(col1 INT NULL, col2 VARCHAR(10) NOT NULL);
GO
CREATE UNIQUE NONCLUSTERED INDEX idx_col1_notnull
ON dbo.T1(col1)
WHERE col1 IS NOT NULL;
GO

[size=large]将以下代码运行2次,尝试向表中插入2行COL1列具有相同非NUL值的行[/size]
INSERT INTO dbo.T1(col1, col2)
VALUES(1, 'a');

[size=large] 代码的第2次运行将失败,提示以下错误信息:[/size]/*
Msg 2601, Level 14, State 1, Line 1
Cannot insert duplicate key row in object 'dbo.T1' with unique index 'idx_col1_notnull'.
The statement has been terminated.
*/
[size=large] 将以下代码运行2次,尝试向表中插入2行COL1列为NULL的行:[/size]
-- Run following twice
INSERT INTO dbo.T1(col1, col2)
VALUES(NULL, 'a');

[size=large]这次两行都插入了。[/size]
-- Cleanup
DROP INDEX Sales.SalesOrderHeader.idx_currate_notnull;
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值