数据完整性约束(SQL Server)
1. PRIMARY KEY 主键约束
- 表中的主键必须满足下列两个条件:
① 任意两行都不具有相同的主键值;
② 每一行都必须具有一个主键值(即主键列不允许空值)。 - 一个表只能有一个主键,主键通常定义在表的一列上,也可以使用多个列的组合定义主键(称为组合主键)。在使用多个列作为主键时,上述两个条件必须应用到构成主键的所有列,即所有组合列的值必须是唯一的(但单个列的值可以不唯一),组合列中的每一个列都必须为非空值。
- 在定义主键约束时, SQL Server 自动为主键列创建一个唯一索引( Unique Index )。该索引可以用来快速数据查询速度。
- 主键可以在创建表时的某一列中定义,也可以通过表修改语句( ALTER TABLE )在创建表之后再定义。在列定义中把一个列设置为主键称为列级约束,在列定义之后设置主键被称为表级约束。组合主键必须使用表级约束进行定义。
- 约束也是一种数据库对象,因此同一个数据库的约束名是不允许重复的。定义列级约束时,约束的名称是可以缺省的,这时 SQL Server 自动为它生成一个名称。但在使用 ALTER TABLE 定义表级约束时,必须明确指定约束的名称。
2.FOREIGN KEY 外键约束
- 通过外键( FOREIGN KEY )来建立和加强两个表数据之间的链接关系。
- 外键约束可以引用另一表中的主键列,也可以引用另一表中具有 UNIQUE 约束的列,也就是说被参照列的值必须是唯一的(即具有 PRIMARY KEY 或 UNIQUE 约束)和非空的。
- 外键约束也可以分为列级约束和表级约束。外键约束使用 FOREIGN KEY 指定引用的列,由 REFERENCES 子句指定被引用的表和列。
- FOREIGN KEY 约束可以引用它自己所在表中的主键或唯一键,这种约束称为自我引用外键约束。当一个表存在自我引用时,必须非常注意记录插入的先后次序。被引用的记录必须先插入到表中,因为只有当它们已经存在于表中之后,其它引用它们的记录才能再插入进去。
3. UNIQUE 唯一约束
- 一个表只能定义一个主键,如果需要在非主键列上也限制输入重复的值,可以使用 UNIQUE 约束。与 PRIMARY KEY 约束不同,一个表中可以定义多个 UNIQUE 约束,而且还允许为空值(允许存在一个空值)的列指定 UNIQUE 约束。
- 在定义 UNIQUE 约束时会创建一个唯一性索引。这个索引可以是 CLUSTERED (聚集索引)或 NONCLUSTERED (非聚集索引),但如果在表中已经存在聚集索引时就不能建立CLUSTERED 索引。
4. CHECK (检验)约束
- CHECK 约束用于定义列允许的格式和值,它通过限制列可接受的值,强制域的完整性。例如,通过创建 CHECK 约束可以把 salary 列的取值范围限制在 15000 至 100000 之间,从而保证输入的薪资值不超出这个范围。为此, CHECK 约束的逻辑表达式为CHECK (Salary >=15000 AND Salary <= 100000)
- SQL Server 允许在一个列中定义多个 CHECK 约束,也允许通过创建表级 CHECK 约束,将一个 CHECK 约束应用于多个列。
- CHECK 约束通常在建表时定义。对于数值型的列,其 CHECK 约束的逻辑表达式往往比较容易定义,而对于字符型的列,则往往需要使用 LIKE 或 IN 进行描述。
- 有些 CHECK 约束在逻辑表达式中包含多个列,这时不能使用列级 CHECK 约束,而应该使用表级 CHECK 约束。表级约束条件可以在创建表时最后一列之后定义,也可以通过ALTER TABLE 语句添加进去。
5.DEFAULT 缺省约束
- DEFAULT 约束用来定义列的缺省值(也称默认值)。如果在插入一条记录时没有为某一列显式提供值,则缺省值可以为该列指定一个值。如果列不允许空值且又没有 DEFAULT 定义,那就必须为该列显式指定值,否则 SQL Server 会返回错误信息。
- 缺省值可以是计算结果为常量的任何值,例如常量、内置函数或数学表达式。通常我们可以将数字型列的缺省值指定为零,将字符串列的缺省值指定为空格。
6. NOT NULL (非空性)
- 列的 为空性( Nullability )决定该列在表中是否允许空值。空值( NULL )并不等于零 (0) 、空格或零长度的字符串(即 ’’ ),空值是指值还没有确定或未被定义( unknown ),而零和空格都是已经明确的值。 例如, Products 表中 UnitPrice 列的空值并不表示该产品没有价格,而是指其价格未知或尚未确定。
补充说明
- ALTER TABLE 的一种常见功能是向已存在的表中添加各类约束,如主键、外键、 CHECK约束、 DEFAULT 约束等,这类操作最主要的风险来自于新增的约束是否会对已有的数据行产生影响。
- 在添加约束时可以使用 WITH CHECK 或 WITH NOCHECK ,指定新增的约束是否对表中原有的数据进行验证。如果不希望对原有数据进行约束验证,可以使用 WITH NOCHECK选项(这种做法是不值得提倡的,只有在极少应用中才会使用)。
/* 增加一个主键约束,并对原有数据加以验证。/
ALTER TABLE 表名 WITH CHECK
ADD CONSTRAINT 约束名 PRIMARY KEY(列名);
/ 增加一个 CHECK 约束,不对原有数据加以验证。*/
ALTER TABLE 表名 WITH NOCHECK
ADD CONSTRAINT 约束名 CHECK(列名 LIKE ‘[1-9][0-9][0-9][0-9]’)
GO