(1) DEFAULT约束
使用默认值(DEFAULT)约束后,如果资料在插入新行时没有显示为列提供资料,系统将默认值赋给该列。默认值约束所提供的默认值可以为常量、函数、系统零进函数、空值(NULL)等。
默认值约束的定义格式为:
[ CONSTRAINT constraint_name ] DEFAULT constraint_expression
其中,constraint_name参数指出所建立的默认值约束名称。constraint_expression表达式为列提供默认值。
在使用DEFAULT约束时,还应注意以下两点: ? 每列只能有一个DEFAULT约束;
? 约束表达式不能参照表中的其它列和其它表、视图或存储过程。
例如,先创建TB_constraint表,并使用默认值约束为country列设置默认值。之后,再执行ALTER TABLE语句为TB_constraint表的name列添加一个默认值约束:
CREATE TABLE TB_constraint (
name char(20) not null, country varchar(30)
CONSTRAINT DF_country DEFAULT ‘China’ ) GO
ALTER TABLE TB_countraint ADD CONSTRANT DF_name DEFAULT ‘UNKNOWN’ FOR name
(2) CHECK约束
CHECK约束限制输入到一列或多列的可能值,从而保证SQL Server数据库中资料的域完整性。在CHECK约束中可以包含搜索条件,但不能包含子查询。一个表可以定义多个CHECK约束,对于列也可以定义多个CHECK约束。
注意:① 对于ALTER TABLE语句可以为同一列添加多个CHECK约束,但对于CREATE
TABLE语句只能为每列定义一个CHECK约束;
② 如果CHECK约束被应用于一列,则它被定义为列级CHECK约束;如果CHECK
约束被应用于多列,则它被定义为表级CHECK约束。
在ALTER TABLE语句和CREATE TABLE语句中,列级CHECK约束和表级CHECK约束的
定义格式分别为:
[ CONSTRAINT constraint_name ] CHECK [ NOT FOR REPLICATION ](逻辑表达式) [ CONSTRAINT constraint_name ]
CHECK [ NOT FOR REPLICATION ](搜索条件) 其中,constraint_name选项指出所建立的CHECK约束的名称。
逻辑表达式可以是AND和OR连接的多个简单逻辑表达式而构成的复合型逻辑表达式,
搜索条件为布尔表达式。
列级CHECK约束只能参照被约束列,而表级CHECK约束则只能参照表中列,它不能参
照其它表中资料。
例如,为前面已经创建的表TB_constraint增加phone字段及其对应的CHECK约束:
ALTER TABLE TB_constraint ADD
Phone char(8) null CONSTRAINT CH_phone CHECK (phone LIKE ‘[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]’) 在ALTER TABLE语句中,使用CHECK或NOCHECK选项可以打开或关闭某个约束,并可
以使用WITH CHECK或WITH NOCHECK子句对表中的资料进行(或不进行)检查。
例如,将上例中所建立的CHECK约束关闭:
ALTER TABLE TB_constraint NOCHECK CONSTRAINT CH_phone (3) PRIMARY KEY约束
PRIMARY KEY约束通过建立唯一索引保证指定列的实体完整性,使用PRIMARY KEY约束时,列的空值属性必须定义为NOT NULL。PRIMARY KEY约束可以应用于表中一列或多列,应用于多列时,它被定义为表级PRIMARY KEY约束,否则被定义为列级PRIMARY KEY约束。
列级PRIMARY KEY约束的定义格式为: [ CONSTRAINT constraint_name ]
PRIMARY KEY [ CLUSTERED | NONCLUSTERED ] [ WITH [ FILLFACTOR = fillfactor ] ] [ ON { filegroup | DEFAULT } ] 表级PRIMARY KEY约束的定义格式为: [ CONSTRAINT constraint_name ]
PRIMARY KEY [ CLUSTERED | NONCLUSTERED ] { ( column [,...n] )}
[ WITH [ FILLFACTOR = fillfactor ] ] [ ON { filegroup | DEFAULT } ]
SQL Server自动为实施PRIMARY KEY约束的列建立唯一索引。如果在PRIMARY KEY约束中未指定索引类型时,默认情况下所建立的索引为簇索引(CLUSTERED)。该索引只能够通过删除PRIMARY KEY约束或其相关表的方法来删除,而不能使用DROP INDEX语句删除。无论是建立列级PRIMARY KEY约束还是表级PRIMARY KEY约束,每个表只能创建一个PRIMARY KEY约束。
在PRIMARY KEY约束定义中,WITH子句设置为PRIMARY KEY约束所建立索引的页面填充度,ON子句指出存储索引的数据库文件组名称。
例如,为表TB_constraint的name列添加PRIMARY KEY约束:
因为PRIMARY KEY约束禁止被约束列出现重复的列值,所以,在建立PRIMARY KEY约束前应删除前面为name列所建立的DEFAULT约束。
ALTER TABLE TB_constraint DROP CONSTRAINT DF_name GO
ALTER TABLE TB_constraint ADD CONSTRAINT PK_name PRIMARY KEY (name)
(4) UNIQUE约束
UNIQUE约束也能保证一列或多列的实体完整性,每个UNIQUE约束要建立一个唯一索引。对于实施UNIQUE约束的列,不允许有任意两行具有相同的索引值。与PRIMARY KEY约束不同的是,SQL Server允许为一个表建立多个UNIQUE约束。
列级UNIQUE约束的定义格式为: [ CONSTRAINT constraint_name ]
UNIQUE [ CLUSTERED | NONCLUSTERED ] [ WITH [ FILLFACTOR = fillfactor ] ] [ ON { filegroup | DEFAULT } ]
UNIQUE约束应用于多列时称作表级UNIQUE约束,其定义格式为: [ CONSTRAINT constraint_name ] UNIQUE [ CLUSTERED | NONCLUSTERED ] { ( column [,...n] )} [ WITH [ FILLFACTOR = fillfactor ] ] [ ON { filegroup | DEFAULT } ]
CLUSTERED和NONCLUSTERED关键词分别要求SQL Server对UNIQUE约束自动创建唯一簇索引和非簇索引。为UNIQUE约束所建立的索引也只能通过删除UNIQUE约束或删除表的方法来删除,而不能够使用DROP INDEX语句删除。
注意:与PRIMARY KEY约束不同的是:UNIQUE约束允许被约束列的空值属性设置为NULL,
但UNIQUE约束不允许表中受约束列有一行以上同时为NULL。
例如,为表TB_constraint添加UNIQUE约束:
ALTER TABLE TB_constraint ADD CONSTRAINT UN_phone UNIQUE (name, phone) FOREIGN KEY约束
FOREIGN KEY约束为表中一列或多列资料提供参照完整性。实施FOREIGN KEY约束时,要求在被参照表中定义了PRIMARY KEY约束或UNIQUE约束。FOREIGN KEY约束限制插入到表中被约束列的值必须在被参照表中已经存在。 表级FOREIGN KEY约束的定义格式为: [ CONSTRAINT constraint_name ]
FOREIGN KEY [ ( column [,...n] ) ]
REFERENCES ref_table [ ( ref_column [,...n] ) ] [ NOT FOR REPLICATION ]
列级FOREIGN KEY约束的定义格式为: [ CONSTRAINT constraint_name ] [ FOREIGN KEY ]
REFERENCES ref_table [ ( ref_column ) ] [ NOT FOR REPLICATION ]
其中,ref_table为被参照表,ref_column指出被参照表中的被参照列。被参照表中必须具有 PRIMARY KEY约束和UNIQUE约束。
在FOREIGN KEY约束中,FOREIGN KEY子句中指定的列数和每列的数据类型必须与REFERENCES子句中的相同。对于列级FOREIGN KEY约束,由于参照列唯一确定,所以可以省略,而只需指出被参照列即可。
使用FOREIGN KEY约束时,必须注意以下几点: ? 一个表最多只能参照253个不同的资料表,每个表也最多只能有253个FOREIGN KEY
约束;
? FOREIGN KEY约束不能应用于临时表;
? 在实施FOREIGN KEY约束时,用户必须至少拥有被参照中参照列的SELECT或
REFERENCES权限;
? FOREIGN KEY约束可以参照自身表中的其它列,这种参照称为自参照; ? FOREIGN KEY约束中,只能参照同一个数据库中的某个表,它不能参照其它数据库
中的表。跨数据库参照约束只能通过触发器来实现。 列如,下面是表titleauthor和表titles的建表语句,为author_id列增加FOREIGN KEY约束:
CREATE TABLE titleauthor (
author_id numeric(8) not null, author_name varchar(12) not null, author_phone varchar(12) null PRIMARY KEY(author_id) )
CREATE TABLE titles (
title_id numeric(8) not null, author_id numeric(8) not null, title varchar(12) null PRIMARY KEY(title_id) )
ALTER TABLE titles
ADD CONSTRAINT FK_author_id FOREIGN KEY (author_id) REFERENCES titleauthor (author_id) 对于一个表,可以使用通过系统存储过程sp_help检索其定义信息,它所返回的内容包括表的结构定义、所有者、创建时间、各种属性、约束和索引等信息。 sp_help的语法格式为:
sp_help [ @objname = ] name
其中,name参数说明所检索表的名称。 四、规 则
1、 功能:规则的的作用与CHECK约束相同,它检查用户为其所关联的列或所关联的用
户的数据类型列所输入数据的有效性。每列或每个用户定义数据类型只能同时关联一个规则,除此之外,每列还可以具有多个CHECK约束。 2、 创建格式:
CREATE RULE rule_name
AS condition_expression
3、 说明:rule_name:所创建的规则名称。
Condition_expression指出规则所定义的条件,它用一个局部变量代表
INSERT语句或UPDATE语句所输入的数值。Condition_expression表达式可以与有效的WHERE子句所指的条件相同,其中可以包含算术运算符、关系运算符和IN、LIKE、BETWEEN等谓词,也可以包含不参照数据库对象的内置函数。但是,在规则定义中,不能参任何列或其它数据对象。
例1、 创建一个规则,限制所输入的数据范围为1到999之间的实数
CREATE RULE money_range
AS @range>1 and @range<999
例2、 创建一个规则,限制用户输入的字符串只能在指定的列表条目中:
CREATE RULE DB_name
AS @db_name IN (‘SQL SERVER’,’ORACLE’,’INFORMIX’)
4、 规则的应用
在建立规则后,应将它们关联到列或用户定义数据类型才能使它们发挥作用,执行系统存储过程sp_bindrule建立规则关联。在用输入或修改数据时激活规则,系统将自动检查列值是否在规则指定的范围内、或是否与规则指定的数据格式相匹配。 系统存储过程sp_bindrule语法格式为:
sp_bindrule [@rulename] ‘rule_name’,[@objname=] ‘object_name’ 说明:rule_name为规则名称
object_name为“表名.列名”格式时,说明它为一列名,否则,sp_bindrule
将 object_name参数视作用户定义数据类型。
例如:在SHIKONG数据库中建立一个shl_rule规则,然后关联到SPKFK表中的shl
列
CREATE RULE shl_rule AS @shl>0
Sp_bindrule shl_rule,’spkfk.shl’ 5、 解除规则
在删除规则前必须执行系统存储过程sp_unbindrule解除规则与列或用户定义数据库类型之间的关联.sp_unbindrule语句的格式为:
sp_unbindrule [@rulename] ‘rule_name’,[@objname=] ‘object_name’
解除关联后,规则仍存储在当前数据库中,这时可执行DROP RULE语句将它删除。在DROP RULE语句的语法格式为: 语法:DROP RULE {rule_name}[,?n]
在一个DROP RULE语句中,可以一次同时删除多个规则,但必须保证这些规则没有相关联的列或用户定义数据类型,否则,系统将取消DROP RULE语句的执行,并返回一条错误信息。
五、默认
默认对象所执行的功能与默认值约束完全一样。但默认值约束是在CREATE TABLE
或ALTER TABLE时定义,它与表定义存储在一起,所以,删除表时,默认值约束被自动删除。而默认对象则需要使用CREATE DEFAULT语句定义,它作为一种数据对象单独存储,所以它可以被多次应用于不同列。在删除表时不能删除默认对象,而需要使用DROP DEFAULT语句删除。 1、 创建默认对象
CREATE DEFAULT [owner.]default_name AS constant_expression
2、 说明:default_name为所建立的默认对象名称。
Constant_expression参数为默认对象所提供数据。它可以是由常量、SQL Server
内置函数、算术表达式和全局变量等所组成的常量表达式,但是不能包含任何列名或其它数据库对象。在Constant_expression表达式中,对于字符和日期类型数据应引在单引号内,二进制数据必须以0X作前导符,货币类型以美元符号$开头,对于其它数据类型(如整数和浮点数等)则不需要定界符。
CREATE DEFAULT语句只能在当前数据库中创建默认对象。对每个用户来说,他在
同一个数据库中所创建的默认对象名称必须保持唯一。
例如:下面语句分别建立一个字符、日期、二进制、货币和整数等数据类型的默认
对象
CREATE DEFAULT DF_char AS ‘UNKNOWN’