加入收藏 | 设为首页 | 会员中心 | 我要投稿 温州站长网 (https://www.0577zz.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

SQL Server中Check约束的学习教程

发布时间:2016-11-27 17:43:56 所属栏目:大数据 来源:站长网
导读:0.什么是Check约束? CHECK约束指在表的列中增加额外的限制条件。 注: CHECK约束不能在VIEW中定义。CHECK约束只能定义的列必须包含在所指定的表中。CHECK约束不能包含子查询。 创建表时定义CHECK约束 1.1 语法: CREATE TABLE table_name( column1 dataty

图2是一个简单的例子,有时候在分区视图中应用Check约束也会提升性能,测试代码如下:

CREATE TABLE [dbo].[Test2007](
  [ProductReviewID] [int] IDENTITY(1,1) NOT NULL,
  [ReviewDate] [datetime] NOT NULL
) ON [PRIMARY]
 
GO
 
ALTER TABLE [dbo].[Test2007] WITH CHECK ADD CONSTRAINT [CK_Test2007] CHECK (([ReviewDate]gt;='2007-01-01' AND [ReviewDate]'2007-12-31'))
GO
 
ALTER TABLE [dbo].[Test2007] CHECK CONSTRAINT [CK_Test2007]
GO
 
CREATE TABLE [dbo].[Test2008](
  [ProductReviewID] [int] IDENTITY(1,1) NOT NULL,
  [ReviewDate] [datetime] NOT NULL
) ON [PRIMARY]
 
GO
 
ALTER TABLE [dbo].[Test2008] WITH CHECK ADD CONSTRAINT [CK_Test2008] CHECK (([ReviewDate]gt;='2008-01-01' AND [ProductReviewID]'2008-12-31'))
GO
 
ALTER TABLE [dbo].[Test2008] CHECK CONSTRAINT [CK_Test2008]
GO
 
INSERT INTO [Test2008] values('2008-05-06')
INSERT INTO [Test2007] VALUES('2007-05-06')
 
CREATE VIEW testPartitionView
AS
SELECT * FROM Test2007
UNION
SELECT * FROM Test2008
 
SELECT * FROM testPartitionView
WHERE [ReviewDate]='2007-01-01'
 
SELECT * FROM testPartitionView
WHERE [ReviewDate]='2008-01-01'
 
SELECT * FROM testPartitionView
WHERE [ReviewDate]='2010-01-01'

我们针对Test2007和Test2008两张表结构一模一样的表做了一个分区视图。并对日期列做了Check约束,限制每张表包含的数据都是特定一年内的数据。当我们对视图进行查询并给定不同的筛选条件时,可以看到结果如图3所示。

20151211155256851.png (669×500)

图3.不同的条件产生不同的执行计划
由图3可以看出,当筛选条件为2007年时,自动只扫描2007年的表,2008年的表也是同样。而当查询范围超出了2007和2008年的Check约束后,查询优化器自动判定结果为空,因此不做任何IO操作,从而提升了性能。
结论
在Check约束条件为简单的情况下(指的是约束限制在单列且表达式中不包含函数),不仅可以约束数据完整性,在很多时候还能够提供给查询优化器信息从而提升性能。


4. 禁用CHECK约束

4.1 语法

ALTER TABLE table_name
DISABLE CONSTRAINT constraint_name;

4.2 示例

--禁用约束
ALTER TABLE tb_supplier DISABLE CONSTRAINT check_tb_supplier_id;

nbsp;
5. 约束详细信息查看
语句:

--查看约束的详细信息
select
constraint_name,--约束名称
constraint_type,--约束类型
table_name,--约束所在的表
search_condition,--约束表达式
status--是否启用
from user_constraints--[all_constraints|dba_constraints]
where constraint_name='CHECK_TB_SUPPLIER_ID';

6. 删除CHECK约束
6.1 语法

ALTER TABLE table_name
DROP CONSTRAINT constraint_name;

6.2 示例

ALTER TABLE tb_supplier
DROP CONSTRAINT check_tb_supplier_id;

(编辑:温州站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

热点阅读