SQL Server中Check约束的学习教程
0.什么是Check约束?CHECK约束指在表的列中增加额外的限制条件。 注: CHECK约束不能在VIEW中定义。CHECK约束只能定义的列必须包含在所指定的表中。CHECK约束不能包含子查询。 创建表时定义CHECK约束 1.1 语法:其中,DISABLE关键之是可选项。如果使用了DISABLE关键字,当CHECK约束被创建后,CHECK约束的限制条件不会生效。
1.2 示例1:数值范围验证验证: insert into tb_supplier values(1,'david louis tian','stk'); 不满足条件的错误提示:
1.3 示例2:强制插入列的字母为大写验证: 不满足条件的错误提示: 2. ALTER TABLE定义CHECK约束2.1 语法其中,DISABLE关键之是可选项。如果使用了DISABLE关键字,当CHECK约束被创建后,CHECK约束的限制条件不会生效。 2.2 示例准备2.3 创建CHECK约束2.4 验证--supplier_name不满足check约束条件,此条记录能够插入失败,并提示相关错误如下insert into tb_supplier values(1,'DELL','HO'); 不满足条件的错误提示: 3. 启用CHECK约束3.1 语法3.2 示例--启用约束ALTER TABLE tb_supplier ENABLE CONSTRAINT check_tb_supplier_id;
3.3使用Check约束提升性能在SQL Server中,SQL语句的执行是依赖查询优化器生成的执行计划,而执行计划的好坏直接关乎执行性能。 在查询优化器生成执行计划过程中,需要参考元数据来尽可能生成高效的执行计划,因此元数据越多,则执行计划更可能会高效。所谓需要参考的元数据主要包括:索引、表结构、统计信息等,但还有一些不是很被注意的元数据,其中包括本文阐述的Check约束。 查询优化器意识到1=2这个条件是永远不相等的,因此不需要返回任何数据,因此也就没有必要扫描表,从图1执行计划可以看出仅仅扫描常量后确定了1=2永远为false后,就可完成查询。 那么Check约束呢? Check约束可以确保一列或多列的值符合表达式的约束。在某些时候,Check约束也可以为优化器提供信息,从而优化性能,比如看图二的例子。 图2.有Check约束的列提升查询性能 图2是一个简单的例子,有时候在分区视图中应用Check约束也会提升性能,测试代码如下: GOALTER TABLE [dbo].[Test2007] WITH CHECK ADD CONSTRAINT [CK_Test2007] CHECK (([ReviewDate]>='2007-01-01' AND [ReviewDate]'2007-12-31')) ALTER TABLE [dbo].[Test2007] CHECK CONSTRAINT [CK_Test2007] CREATE TABLE [dbo].[Test2008]( GO ALTER TABLE [dbo].[Test2008] WITH CHECK ADD CONSTRAINT [CK_Test2008] CHECK (([ReviewDate]>='2008-01-01' AND [ProductReviewID]'2008-12-31')) ALTER TABLE [dbo].[Test2008] CHECK CONSTRAINT [CK_Test2008] INSERT INTO [Test2008] values('2008-05-06') CREATE VIEW testPartitionView SELECT * FROM testPartitionView SELECT * FROM testPartitionView SELECT * FROM testPartitionView 我们针对Test2007和Test2008两张表结构一模一样的表做了一个分区视图。并对日期列做了Check约束,限制每张表包含的数据都是特定一年内的数据。当我们对视图进行查询并给定不同的筛选条件时,可以看到结果如图3所示。 图3.不同的条件产生不同的执行计划
4. 禁用CHECK约束4.1 语法4.2 示例
5. 约束详细信息查看语句:
|