筛选索引简单使用

对于在强制实施数据完整性时的一种常见需求,也可以用筛选索引来解决。出于强制唯一性的目的,SQL Server支持的UNIQUE约束认为两个NULL是相等的,这意味着,如果在一个允许为NULL的列上定义了一个UNIQUE约束,那么这个列上就只能有一行可以为NULL。但在一些情况下,可能只需要对非NULL值强制实施唯一性约束,允许存在多个NULL值。ANSI SQL确实支持这种UNIQUE约束,但SQL SERVER还从未实施过这种约束。现在,有了筛选索引,这种需求解决起来也不难。只要创建一个唯一的筛选索引,将其筛选谓词定义为WHERE<列>IS NOT NULL。例如,运行以下代码,创建一个T1表,并在它的COLL列 定义一个这样的筛选索引:
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
  

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

代码的第2次运行将失败,提示以下错误信息:/*
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.
*/
将以下代码运行2次,尝试向表中插入2行COL1列为NULL的行:
-- Run following twice
INSERT INTO dbo.T1(col1, col2)
  VALUES(NULL, 'a');

这次两行都插入了。
-- Cleanup
DROP INDEX Sales.SalesOrderHeader.idx_currate_notnull;

猜你喜欢

转载自new-fighter.iteye.com/blog/1634830
今日推荐