唯一性约束:
所谓唯一性约束(unique constraint)不过是数据表内替代键的另一个名称而已。替代键(alternate key)可以是数据表内不作为主键的其他任何列,只要该键对该数据表唯一即可。换句话说,在唯一列内不允许出现数据重复的现象唯一性约束指定一个或多个列的组合的值具有唯一性,以防止在列中输入重复的值。唯一性约束指定的列可以有NULL 属性。
语法:
CONSTRAINT constraint_name
UNIQUE [CLUSTERED | NONCLUSTERED]
(column_name1[, column_name2,…,column_name16])
DEMO1:
创建国家(Country)表,指定国家不能重复,ID号为主键。
CREATE TABLE Country
(
cCountryId CHAR(3) PRIMARY KEY, /*省略部分关键字,行级约束,没有指定约束名*/
cCountry CHAR(25) NOT NULL UNIQUE ) /*行级约束,没有指定约束名*/
插入3条数据:
insert into Country
values
(‘A01‘,‘china‘),
(‘A02‘,‘<?xml:namespace prefix="st1">yemen‘?xml:namespace>),
(‘A03‘,‘IR‘)
查看结果:
select * from Country
新插入一条数据,在列cCountry中指一条记录与之前插入记录值相同的数值:
insert into Country
values (‘A04‘,‘china‘)
出下如下错误:
消息2627,级别14,状态1,第2 行
违反了UNIQUE KEY 约束‘UQ__Country__62A4127E20C1E124‘。不能在对象‘dbo.Country‘ 中插入重复键。
语句已终止。
DEMO2:若表已创建,通过ALTER TABLE来进行创建UNIQUE约束
alter table country
add constraint UQ_Country_cCountry unique (cCountry)
/*表级约束*/
图形化界面创建:
数据库 → 表 → 设计 → 选择创建约束的列 → 右键 → 索引/键
创建约束
CHECK约束:
CHECK 约束(CHECK 约束:定义列中可接受的数据值,检查约束通过限制插入列中的值来实施域完整性。可以在一列上定义多个检查约束。它们按照定义的次序被实施。当约束被定义成表级时,单一的检查约束可以被应用到多列,也可以将多个 CHECK 约束应用于单个列。当除去某个表时,也将除去 CHECK 约束。
CHECK约束的限制:
○1 、CHECK 约束不接受计算结果为FALSE 的值。因为空值的计算结果为UNKNOWN,所以表达式中存在这些值可能会覆盖约束,例如,假设对int 列 MyColumn 应用一个约束,指定 MyColumn 只能包含值10(即 MyColumn = 10)。如果将值NULL 插入到 MyColumn,数据库引擎将插入 NULL 且不返回错误。
○2 、如果 CHECK 约束检查的条件对于表中的任何行都不是 FALSE,它将返回 TRUE。如果刚创建的表没有任何行,则此表的任何 CHECK 约束都视为有效
○3 、执行 DELETE 语句时不验证CHECK 约束。因此,使用特定类型的 CHECK 约束对表执行 DELETE 语句时可能会产生意外结果
DEMO:假设对表 CheckTbl 执行下列语句。
INSERT INTO CheckTbl VALUES (10, 10)
GO
DELETE CheckTbl WHERE col1 = 10;
即使 CHECK 约束指定表 CheckTbl 必须至少包含 1 行,DELETE 语句也会成功
语法:
CONSTRAINT constraint_name
CHECK [NOT FOR REPLICATION]
(logical_expression)
CHECK约束可以连同下列关键字或命令一起指定:
IN关键字
使用IN 关键字可以确保:键入的值被限制在一个常数表达式列表中。
例如:下列命令在表Shopper的列cCity上创建了CHECK约束chkCity,这样就能将输入限制在合法的城市中。
CREATE TABLE Shopper
(
cCity CHAR(15) NOT NULL CONSTRAINT chkCity CHECK(cCity IN (‘Boston‘, ‘Chicago‘,‘
Dallas‘,‘New York‘, ‘Paris‘,‘Washington‘))
)
LIKE关键字
使用LIKE关键字可以通过通配符来确保输入某一列的值符合一定的模式。
例如:
CHECK (cShopperId LIKE ‘[0-9][0-9][0-9][0-9] [0-9][0-9]‘)
上述CHECK约束指定[0-9]——[0-9],之间只能包含六位数值。
BETWEEN 关键字
可以通过BETWEEN关键字来指明常数表达式的范围。该范围中包括上限值和下限值。
例如:
CHECK (siToyQoh BETWEEN 0 AND 100)
上述CHECK约束指定了属性siToyQoh的值只能在0和100之间。
创建Check约束时应遵循的规则:
它可以在列级或表级创建。
它用来限制可以插入到该列的值。
它可以包含用户自定义的搜索条件。
它不能包含子查询。
如果创建时指定了WITH NOCHECK选项,就不检查已有数据。
它可以引用同一表中的其他列
DEMO:限制表tb2中列silowerage输入值需>=2,列siupperage输入值需<=100
alter table tb2
add constraint CK_tb2_silowerage
check (silowerage >=2)
alter table tb2
add constraint CK_tb2_siupperage
check (siupperage <=100)
当插入数值不满足check约束时,返回如下错误:
insert into tb2
values(‘p0001‘,‘bus‘,‘A-B1‘,‘BIG‘,‘150.00‘,‘P01‘,null,1,100,null,null)
消息547,级别16,状态0,第1 行
INSERT 语句与CHECK 约束"CK_tb2_silowerage"冲突。该冲突发生于数据库"demo_db",表"dbo.tb2", column ‘silowerage‘。
语句已终止。
insert into tb2
values(‘p0001‘,‘bus‘,‘A-B1‘,‘BIG‘,‘150.00‘,‘P01‘,null,4,101,null,null)
消息547,级别16,状态0,第1 行
INSERT 语句与CHECK 约束"CK_tb2_siupperage"冲突。该冲突发生于数据库"demo_db",表"dbo.tb2", column ‘siupperage‘。
语句已终止。
使用图形化界面创建CHECK约束:
数据库 → 表 → 设计 → 选择列 → 右键 → check 约束
缺省约束:
缺省约束可用于为某列指定一个常数值,这样用户就不需要为该列插入值。只能在一列上创建一个缺省约束,且该列不能是IDENTITY列。
缺省约束通过定义列的默认值或使用数据库的默认值对象绑定表的列,来指定列的默认值。SQL Server 推荐使用缺省约束,而不使用定义默认值的方式来指定列的默认值。
语法:
CONSTRAINT constraint_name
DEFAULT constant_expression [FOR column_name]
DEMO:在Shopper的cCity属性上创建DEFAULT约束。如果没有指定城市,则属性cCity将缺省地包含―Chicago‖。
CREATE TABLE Shopper
(
cCid int,cCity char(15) DEFAULT ‘Chicago‘
)
如果表已经创建,但没有指定缺省,则可以用ALTER TABLE命令来指定缺省:
alter table shopper
add constraint DF_Shopper_cCity default ‘gddg‘ for cCity
删除缺省约束:
alter table shopper
drop constraint DF_Shopper_cCity