SQL Server使用约束来强制列数据的完整性。主键和外键都是约束的一种形式。其他用于列的约束形式包括:
- UNIQUE约束,它强制表的非主键列的唯一性:
- DEFAULT约束,当将某行首次插入表中但不知道某列的值时可以使用它,但是仍然希望使用期望的值来填充列;
- CHECK约束,用于定义列允许的数据格式和允许的值。
一个表只能定义一个主键。如果希望为其他非主键列强制唯一性,可以使用UNIQUE约束。根据定义,唯一约束创建一个替代键。和PRIMARY KEY约束不同,你可以为一个表创建多个UNIOUE约束,并且也可以为允许NULL值的列指定UNIQUE约束(每个表的单列键只允许一个NULL值)。和主键相似的是,UNIQUE约束通过确保行被唯一标识来保证实体完整性。
UNIQUE约束在创建的时候会创建一个基础表索引。这个索引可以是CLUSTERED的或者NONCLUSTERED的,但是在表已经存在聚集索引的时候不能创建CLUSTERED索引。
和PRIMARY KEY约束一样,可以在创建表的时候在列定义或者表约束级别定义一个UNIQUE约束。在创建表的时候定义一个UNioUE约束的语法如下:
(column_name <data_type> [NULL | NOT NULL ] UINQUE)
例如:
USE AdventureWorks
GO
CREATE TABLE HumanResources.EmployeeAnnualReview
(
EmployeeAnnualReviewID int NOT NULL PRIMARY KEY,
EmployeeID int NOT NULL,
AnnualReviewSummaryDESC varchar(900) NOT NULL UNIQUE
)
可以通过创建表约束来对多个列应用唯一约束:
CONSTRAINT constraint_name UNIQUE
(column [ACE | CESC ] [,...n])
UNIQUE约束参数
参 数 | 描 述 |
Constraint_name | 这个参数指定了要增加的约束的唯一名 |
(column [ACE | CESC ] [,...n]) | 存储在列中的值必须唯一标识表中的一行(比如,对于所有指定列,任意两行都不可以有相同的值)。ASE(升序)和DESC(降序)选项定义了列在聚集和非聚集索引中的排列顺序 |
USE AdventureWorks
GO
DROP TABLE Person.EmergencyContact
CREATE TABLE Person.EmergencyContace
(
EmergencyContactID int NOT NULL PRIMARY KEY,
EmployeeID int NOT NULL,
ContactFirstNM varchar(50) NOT NULL,
ContactLastNM varchar(50) NOT NULL,
ContactPhoneNBR varchar(25) NOT NULL,
CONSTRAINT UNQ_EmergencyContact_FirstNM_LastNM_PHONENBR
UNIQUE (ContactFirstNM,ContactLastNM,contactPhoneNBR)
)