数据完整性与约束
数据库完整性指存储在数据库中数据的一致性和标准性。在数据库规划中,确定用于强制数据完整性(约束)的最佳方法是最重要的一步。这篇讲完整性类型、各种约束(DEFAULT/CHECK/PRIMARY KEY/UNIQUE/FOREIGN KEY)、级联操作,以及默认值与规则。
数据完整性类型
| 类型 | 含义 | 对应约束 |
|---|---|---|
| 域(列)完整性 | 指定列的一组有效值,决定是否允许空值,可限定类型、格式和取值范围 | DEFAULT、CHECK、NULL |
| 实体(行)完整性 | 要求表中所有行具有唯一标识符(如主键值) | PRIMARY KEY、UNIQUE |
| 参照(引用)完整性 | 确保维持主关键字和外部关键字的关系 | FOREIGN KEY |
约束类型一览:
| 完整性类型 | 约束类型 | 说明 |
|---|---|---|
| 域(列) | DEFAULT | 指定列的默认值 |
| 域(列) | CHECK | 指定列的允许值 |
| 域(列) | NULL | 指定是否允许 NULL |
| 实体(行) | PRIMARY KEY | 唯一标识每一行 |
| 实体(行) | UNIQUE | 防止非主键重复 |
| 引用 | FOREIGN KEY | 定义值必须与此表主键匹配的列 |
DEFAULT 默认约束
执行 INSERT 时将默认值自动插入约束所在的列:
ALTER TABLE 表名
ADD CONSTRAINT 约束名
DEFAULT (默认值) FOR 字段名
GO注意:每列只能定义一个 DEFAULT 约束;不能用于有 IDENTITY 属性的列;若默认值长于字段允许长度,输入时会被截断。
CHECK 检查约束
每次执行 INSERT / UPDATE 时校验数据的合法性:
ALTER TABLE 表名
ADD CONSTRAINT 约束名
CHECK (条件)
GO注意:一个表可定义多个 CHECK 约束,但每个字段只能定义一个。
PRIMARY KEY 主键约束
ALTER TABLE 表名
ADD CONSTRAINT 约束名
PRIMARY KEY (字段名)
GO特点:一个表只能有一个主键(PK),不能有空值、不能有重复值;PK 所在列能唯一标识此行;可与外键(FK)关联,PK 所在表为主表;创建时会同时生成一个与约束同名的簇索引(聚集索引)。
UNIQUE 唯一约束
ALTER TABLE 表名
ADD CONSTRAINT 约束名
UNIQUE (字段名)
GO特点:指定列中两行不能有相同的值,只能有一行为空值;自动创建一个与约束同名的非簇索引;在插入/修改时自动执行。
FOREIGN KEY 外键约束
参照完整性确保维持主关键字(在主表中)和外部关键字(在辅表中)的关系:
ALTER TABLE 表名1
ADD CONSTRAINT 约束名
FOREIGN KEY (字段名)
REFERENCES 表名2 (字段名)
GO注意:FOREIGN KEY 子句中指定的列数和数据类型必须与 REFERENCES 子句的列数和数据类型匹配;外键约束不会自动创建索引。
级联更新与删除
仅对主键表中的记录进行删除/更新时,外键表中对应的记录也跟着删除/更新:
-- 级联删除
... ON DELETE CASCADE
-- 级联更新
... ON UPDATE CASCADE级联更新和级联删除同时存在时,二者之间不需用逗号隔开。
删除约束
ALTER TABLE 表名
DROP CONSTRAINT 约束名注意:
- 要删除被约束的列,必须先删除约束。
- 存在外键约束时,要删除主键,必须先删除对应的外键。
默认值与规则
默认值(defaults)和规则(rules)是可以绑定到列或用户自定义数据类型上的对象。
创建并绑定默认值:
CREATE DEFAULT 默认值名称 AS 约束表达式
GO
-- 绑定到列
EXEC sp_bindefault 默认值名称, '表名.列名'
-- 解除绑定
EXEC sp_unbindefault '表名.列名'创建并绑定规则(指定列中可接受的值,确保数据落入指定范围):
CREATE RULE 规则名称 AS 条件表达式
GO
-- 绑定
EXEC sp_bindrule 规则名称, '表名.列名'
-- 解除
EXEC sp_unbindrule '表名.列名'删除默认值和规则:
DROP DEFAULT 默认值名
DROP RULE 规则名称最后更新于