约束是SQL Server提供的自动强制数据完整性的一种方式,它定义列的取值规则,是强制完整性的标准机制。
列的为空性决定表中的行是否可为该列包含空值。空值(或NULL)不同于零(0)、空白或长度为零的字符串(如“”)。NULL的意思是没有输入。出现NULL通常表示值未知或未定义。
(1)创建非空约束。在用CREATE TABLE创建表时,使用NOT NULL关键字指定非空约束,其语法格式如下:
[CONSTRAINT <约束名>] NOT NULL
(2)修改非空约束。修改非空约束的语法如下:
ALTER TABLE table_name alter column column_name column_type null | not null
参数说明如下。
table_name:修改非空约束的表名。
column_name:修改非空约束的列名。
column_type:修改非空约束的类型。
null | not null:修改为空或者非空。
【例4.10】 修改mingri表中的非空约束,SQL语句及运行结果如图4.12所示。 (实例位置:资源包\TM\sl\4\10)
USE db_Test --打开数据库 ALTER TABLE mingri --更改表 alter column ID int null --更改ID字段属性
图4.12 非空约束
通过定义PRIMARY KEY约束创建主键,用于强制表的实体完整性。一个表只能有一个PRIMARY KEY约束,并且PRIMARY KEY约束中的列不能接受空值。PRIMARY KEY约束保证数据的唯一性,因此经常对标识列定义这种约束。
(1)在创建表时创建主键约束。
【例4.11】 创建数据表Employee5,并将字段ID设置主键约束,SQL语句及运行结果如图4.13所示。 (实例位置:资源包\TM\sl\4\11)
图4.13 主键约束
例4.11的代码中,CONSTRAINT PK_ID PRIMARY KEY为创建一个主键约束,PK_ID为用户自定义的主键约束名称,主键约束名称必须是合法的标识符。
(2)在现有表中创建主键约束的语法如下。
ALTER TABLE table_name ADD CONSTRAINT constraint_name PRIMARY KEY [CLUSTERED | NONCLUSTERED] {(Column[,…n])}
参数说明如下。
CONSTRAINT:创建约束的关键字。
constraint_name:创建约束的名称。
PRIMARY KEY:表示创建约束的类型为主键约束。
CLUSTERED | NONCLUSTERED:表示为PRIMARY KEY或UNIQUE约束创建聚集或非聚集索引的关键字。PRIMARY KEY约束默认为CLUSTERED,UNIQUE约束默认为NONCLUSTERED。
【例4.12】 对mingri表中的ID字段添加主键约束。 (实例位置:资源包\TM\sl\4\12)
SQL语句如下:
USE db_Test ALTER TABLE mingri --更改表 ADD CONSTRAINT PRM_son PRIMARY KEY (ID) --对ID字段添加主键约束
若要修改PRIMARY KEY约束,必须先删除现有的PRIMARY KEY约束,然后再用新定义重新创建该约束。
删除主键约束的语法如下:
ALTER TABLE table_name DROP CONSTRAINT constraint_name[,…n]
【例4.13】 删除mignri表中的主键约束。 (实例位置:资源包\TM\sl\4\13)
SQL语句如下:
USE db_Test ALTER TABLE mingri DROP CONSTRAINT PRM_son --删除主键约束
唯一(UNIQUE)约束用于强制实施列集中值的唯一性。根据UNIQUE约束,表中的任何两行都不能有相同的列值。另外,主键也强制实施唯一性,但主键不允许NULL作为一个唯一值。
(1)在创建表时创建唯一约束。
【例4.14】 在db_Test数据库中创建数据表Employee6,并将字段ID设置唯一约束,如图4.14所示。 (实例位置:资源包\TM\sl\4\14)
SQL语句如下:
(2)在现有表中创建唯一约束的语法如下。
ALTER TABLE table_name ADD CONSTRAINT constraint_name UNIQUE [CLUSTERED | NONCLUSTERED] {(column [,…n])}
参数说明如下。
table_name:创建唯一约束的表名。
constraint_name:唯一约束名。
column:创建唯一约束的列名。
【例4.15】 为Employee6表中的ID字段设置唯一约束。 (实例位置:资源包\TM\sl\4\15)
SQL语句如下:
USE db_Test ALTER TABLE Employee6 ADD CONSTRAINT Unique1_ID --设置唯一约束 UNIQUE(ID)
运行结果如图4.15所示。
图4.14 唯一约束
图4.15 在现有表中创建唯一约束
若要修改UNIQUE约束,必须删除现有的UNIQUE约束,用新定义重新创建。
删除唯一约束的语法如下:
ALTER TABLE table_name DROP CONSTRAINT constraint_name[,…n]
【例4.16】 删除Employee6表中的唯一约束。 (实例位置:资源包\TM\sl\4\16)
SQL语句如下:
USE db_Test ALTER TABLE Employee6 DROP CONSTRAINT Unique1_ID
检查(CHECK)约束可以强制域的完整性。CHECK约束类似于FOREIGN KEY约束,可以控制放入列中的值。但是,它们在确定有效值的方式上有所不同:FOREIGN KEY约束从其他表获得有效值列表,而CHECK约束通过不基于其他列中的数据的逻辑表达式确定有效值。
(1)在创建表时创建检查约束。
【例4.17】 创建数据表Employee7,为字段Sex设置检查约束,在输入性别字段时,只能接受“男”或者“女”,不能接受其他数据。 (实例位置:资源包\TM\sl\4\17)
SQL语句如下:
运行结果如图4.16所示。
(2)在现有表中创建检查约束的语法如下。
ALTER TABLE table_name ADD CONSTRAINT constraint_name CHECK (logical_expression)
参数说明如下。
table_name:创建检查约束的表名。
constraint_name:检查约束名。
logical_expression:检查约束的条件表达式。
【例4.18】 为Employee5表中的Sex字段设置检查约束,在输入性别时只能接受“女”,不能接受其他字段。 (实例位置:资源包\TM\sl\4\18)
SQL语句如下:
USE db_Test ALTER TABLE [Employee5] ADD CONSTRAINT Check_Sex Check(sex='女')
运行结果如图4.17所示。
图4.16 检查约束
图4.17 在现有表中创建检查约束
修改表中某列的CHECK约束使用的表达式,首先删除现有的CHECK约束,然后使用新定义重新创建,才能修改CHECK约束。
删除检查约束的语法如下:
ALTER TABLE table_name DROP CONSTRAINT constraint_name[,…n]
删除Employee5表中的检查约束,SQL语句如下:
USE db_Test ALTER TABLE Employee5 DROP CONSTRAINT Check_Sex --删除约束
在创建或修改表时可通过定义默认(DEFAULT)约束创建默认值。默认值是计算结果为常量的任何值,如常量、内置函数或数学表达式。其为每一列分配一个常量表达式作为默认值。
(1)在创建表时创建默认约束。
【例4.19】 创建数据表Employee8,并为字段Sex设置默认约束“女”。 (实例位置:资源包\TM\ sl\4\19)
SQL语句如下:
运行结果如图4.18所示。
图4.18 创建表时创建默认约束
(2)在现有表中创建默认约束的语法如下。
ALTER TABLE table_name ADD CONSTRAINT constraint_name DEFAULT constant_expression [FOR column_name]
参数说明如下。
table_name:创建默认约束的表名。
constraint_name:默认约束名。
constant_expression:默认值。
【例4.20】 为Employee6表中的Sex字段设置默认约束“男”。 (实例位置:资源包\TM\sl\4\20)
SQL语句如下:
ALTER TABLE [Employee6] ADD CONSTRAINT Default_Sex_Man --设置默认约束 DEFAULT '男' FOR Sex --默认值为“男”
修改表中某列的Default约束使用的表达式,首先删除现有的Default约束,然后使用新定义重新创建,才能修改Default约束。
删除默认约束的语法如下:
ALTER TABLE table_name DROP CONSTRAINT constraint_name[,…n]
【例4.21】 删除Employee6表中的默认约束。 (实例位置:资源包\TM\sl\4\21)
SQL语句如下:
USE db_Test ALTER TABLE Employee6 DROP CONSTRAINT Default_Sex_Man
通过定义FOREIGN KEY约束来创建外键。在外键引用中,当一个表的列被引用作为另一个表的主键值的列时,就在两表之间创建了链接。这个列就成为第二个表的外键。
(1)在创建表时创建外键约束。
【例4.22】 创建表mrsoft,并为mrsoft表创建外键约束,该约束把mrsoft中的编号(ID)字段和表Employe中的编号(ID)字段关联起来,实现mrsoft中的编号(ID)字段的取值要参照表Employee中编号(ID)字段的数据值。 (实例位置:资源包\TM\sl\4\22)
SQL语句如下:
FOREIGN KEY (ID)中的ID字段为Employee表中的编号(ID)字段。
(2)在现有表中创建默认约束的语法如下。
ALTER TABLE table_name ADD CONSTRAINT constraint_name [FOREIGN KEY]{(column_name[,…n])} REFERENCES ref_table[(ref_column_name[,…n])]
创建外键约束语句的参数及其说明如表4.6所示。
表4.6 创建外键约束语句的参数及其说明
【例4.23】 将Employee表中的ID字段设置为mrsoft表中的外键。 (实例位置:资源包\TM\sl\4\23)
SQL语句如下:
use db_Test ALTER TABLE mrsoft ADD CONSTRAINT Fkey_ID_2 --添加外键 FOREIGN KEY (ID) --所选字段为ID REFERENCES Employee(ID) --参照Employee表的ID字段
修改表中某列的FOREIGN KEY约束。首先删除现有的FOREIGN KEY约束,然后使用新定义重新创建,才能修改FOREIGN KEY约束。
删除外键约束的语法如下:
ALTER TABLE table_name DROP CONSTRAINT constraint_name[,…n]
【例4.24】 删除Employee表中的外键约束。 (实例位置:资源包\TM\sl\4\24)
SQL语句如下:
use db_Test Alter Table mrsoft Drop CONSTRAINT FKEY_ID