Q: 使用约束的目的是什么?
A: 确保表中数据完整性
分类
- 主键约束( PRIMARY KEY, PK ): 要求主键列数据唯一,并且不允许为空。常用于 ID 自增列
- 唯一约束( UNIQUE, UQ ): 要求该列数据唯一,允许为空,但只能出现一个空值。常用于身份证号、编号类
- 检查约束( CHECK, CK ): 某列取值范围限制、格式限制
- 默认约束( DEFAULT, DF ): 某列的默认值
- 外键约束( FOREIGN KEY, FK ): 用于两表间建立关系,需要指定引用主表的哪列
- 非空约束( NOT NULL , NN): 有利于数据检索
作用
实体完整性
- 能够唯一标识表中的每一条记录
- 实现方式:主键、唯一键、IDENTITY属性
域完整性
- 表中特定列数据的有效性,确保不会输入无效的值
- 实现方式:类型、缺省值、约束、空值
引用完整性
- 维护表间的数据有效性、完整性
- 实现方式:建立外键联系另一个表的主键
自定义完整性
- 根据业务处理流程定义的特定业务规则
- 实现方式:存储过程、触发器、规则
约束操作
主键约束
主键只能有一个,但是可以由 1-n 个字段组成,多个字段组成的主键叫复合主键
CREATE TABLE 表名(列名 数据类型 PRIMARY KEY);GO
CREATE TABLE 表名(列名1 数据类型 ,列名2 数据类型PRIMARY KEY(列名1));GO
CREATE TABLE 表名(列名1 数据类型,列名2 数据类型CONSTRAINT pk_表名 PRIMARY KEY(列名1));GO
约束名取名规则推荐:约束类型缩写表名,或者约束类型缩写列名
CREATE TABLE 表名(列名1 数据类型 NOT NULL,列名2 数据类型);GOALTER TABLE 表名 ADD CONSTRAINT 主键名 PRIMARY KEY(列名1);
如果增加主键,前提是主键不能为空
外键约束
CREATE TABLE 主表名(列名1 数据类型 PRIMARY KEY,列名2 数据类型);GO
CREATE TABLE 从表名(列名1 数据类型 RPIMARY KEY,列名2 数据类型 FOREIGN KEY REFERENCES 主表名(列名1) -- 外键的数据类型要与主表中的关联列数据类型一致);GO
CREATE TABLE 从表名(列名1 数据类型 RPIMARY KEY,列名2 数据类型,FOREIGN KEY(列名2) REFERENCES 主表名(列名1));GO
CREATE TABLE 从表名(列名1 数据类型 RPIMARY KEY,列名2 数据类型,CONSTRAINT fk_从表名_主表名 FOREIGN KEY(列名2) REFERENCES 主表名(列名1));GO
唯一约束
CREATE TABLE 从表名(列名 数据类型 UNIQUE);GO
检查约束
CREATE TABLE 从表名(列名 数据类型 CHECK(列名范围或者列名限制));GO
默认约束
CREATE TABLE 从表名(列名 数据类型 DEFAULT(列名的默认条件));GO
ALTER TABLE 表名 ADD CONSTRAINT DF_表名 DEFAULT('值') FOR 列名;
ALTER TABLE 表名 ALTER 列名 SET DEFAULT '值';
ALTER TABLE 表名 ALTER COLUMN 列名 DROP DEFAULT;
ALTER TABLE 表名 ALTER 列名 DROP DEFAULT;
非空约束
NULL 空值代表丢失的未知数据。默认情况下,表列可以保存 NULL值,它是未知或不适当值的占位符
CREATE TABLE 从表名(列名 数据类型 NOT NULL);GO
所有字段没有特殊要求,建议设置为非空,有利于数据的检索
NULL 操作
SELECT * FROM 表名 WHERE 列名 IS NULL| IS NOT NULL;
- NULL 值在建表的时候就可以默认分配
其他操作
增加约束
ALTER TABLE 表名 ADD CONSTRAINT 约束名 约束类型(约束列);
修改约束
ALTER TABLE 表名 ALTER COLUMN 约束名 约束类型(约束列);
删除约束
ALTER TABLE 表名 DROP CONSTRAINT 约束名;
主键自增
CREATE TABLE 表名(列名 数字类型 PRIMARY KEY IDENTITY[(m, n)] -- m 表示起始值, n 表示步长);GO
(m, n) 不写,默认从 1 开始,步长为 1
CREATE TABLE 表名(列名 非数字类型 UNIQUEIDENTIFIER PRIMARY KEY);GOINSERT INTO 表名 VALUES(NEWID(), 列名)
NEWID() 唯一标识符只适合单机数据库和并发量小的情况
