Q: 使用约束的目的是什么?
A: 确保表中数据完整性

分类

  • 主键约束( PRIMARY KEY, PK ): 要求主键列数据唯一,并且不允许为空。常用于 ID 自增列
  • 唯一约束( UNIQUE, UQ ): 要求该列数据唯一,允许为空,但只能出现一个空值。常用于身份证号、编号类
  • 检查约束( CHECK, CK ): 某列取值范围限制、格式限制
  • 默认约束( DEFAULT, DF ): 某列的默认值
  • 外键约束( FOREIGN KEY, FK ): 用于两表间建立关系,需要指定引用主表的哪列
  • 非空约束( NOT NULL , NN): 有利于数据检索

作用

  • 实体完整性

    • 能够唯一标识表中的每一条记录
    • 实现方式:主键、唯一键、IDENTITY属性
  • 域完整性

    • 表中特定列数据的有效性,确保不会输入无效的值
    • 实现方式:类型、缺省值、约束、空值
  • 引用完整性

    • 维护表间的数据有效性、完整性
    • 实现方式:建立外键联系另一个表的主键
  • 自定义完整性

    • 根据业务处理流程定义的特定业务规则
    • 实现方式:存储过程、触发器、规则

约束操作

主键约束

主键只能有一个,但是可以由 1-n 个字段组成,多个字段组成的主键叫复合主键

  1. CREATE TABLE 表名
  2. (
  3. 列名 数据类型 PRIMARY KEY
  4. );
  5. GO
  1. CREATE TABLE 表名
  2. (
  3. 列名1 数据类型 ,
  4. 列名2 数据类型
  5. PRIMARY KEY(列名1)
  6. );
  7. GO
  1. CREATE TABLE 表名
  2. (
  3. 列名1 数据类型,
  4. 列名2 数据类型
  5. CONSTRAINT pk_表名 PRIMARY KEY(列名1)
  6. );
  7. GO

约束名取名规则推荐:约束类型缩写表名,或者约束类型缩写列名

  1. CREATE TABLE 表名
  2. (
  3. 列名1 数据类型 NOT NULL,
  4. 列名2 数据类型
  5. );
  6. GO
  7. ALTER TABLE 表名 ADD CONSTRAINT 主键名 PRIMARY KEY(列名1);

如果增加主键,前提是主键不能为空

外键约束

  1. CREATE TABLE 主表名
  2. (
  3. 列名1 数据类型 PRIMARY KEY,
  4. 列名2 数据类型
  5. );
  6. GO
  1. CREATE TABLE 从表名
  2. (
  3. 列名1 数据类型 RPIMARY KEY,
  4. 列名2 数据类型 FOREIGN KEY REFERENCES 主表名(列名1) -- 外键的数据类型要与主表中的关联列数据类型一致
  5. );
  6. GO
  1. CREATE TABLE 从表名
  2. (
  3. 列名1 数据类型 RPIMARY KEY,
  4. 列名2 数据类型,
  5. FOREIGN KEY(列名2) REFERENCES 主表名(列名1)
  6. );
  7. GO
  1. CREATE TABLE 从表名
  2. (
  3. 列名1 数据类型 RPIMARY KEY,
  4. 列名2 数据类型,
  5. CONSTRAINT fk_从表名_主表名 FOREIGN KEY(列名2) REFERENCES 主表名(列名1)
  6. );
  7. GO

唯一约束

  1. CREATE TABLE 从表名
  2. (
  3. 列名 数据类型 UNIQUE
  4. );
  5. GO

检查约束

  1. CREATE TABLE 从表名
  2. (
  3. 列名 数据类型 CHECK(列名范围或者列名限制)
  4. );
  5. GO

默认约束

  1. CREATE TABLE 从表名
  2. (
  3. 列名 数据类型 DEFAULT(列名的默认条件)
  4. );
  5. GO
  1. ALTER TABLE 表名 ADD CONSTRAINT DF_表名 DEFAULT('值') FOR 列名;
  1. ALTER TABLE 表名 ALTER 列名 SET DEFAULT '值';
  1. ALTER TABLE 表名 ALTER COLUMN 列名 DROP DEFAULT;
  1. ALTER TABLE 表名 ALTER 列名 DROP DEFAULT;

非空约束

NULL 空值代表丢失的未知数据。默认情况下,表列可以保存 NULL值,它是未知或不适当值的占位符

  1. CREATE TABLE 从表名
  2. (
  3. 列名 数据类型 NOT NULL
  4. );
  5. GO

所有字段没有特殊要求,建议设置为非空,有利于数据的检索

NULL 操作

  1. SELECT * FROM 表名 WHERE 列名 IS NULL| IS NOT NULL;
  • NULL 值在建表的时候就可以默认分配

其他操作

增加约束

  1. ALTER TABLE 表名 ADD CONSTRAINT 约束名 约束类型(约束列);

修改约束

  1. ALTER TABLE 表名 ALTER COLUMN 约束名 约束类型(约束列);

删除约束

  1. ALTER TABLE 表名 DROP CONSTRAINT 约束名;

主键自增

  1. CREATE TABLE 表名
  2. (
  3. 列名 数字类型 PRIMARY KEY IDENTITY[(m, n)] -- m 表示起始值, n 表示步长
  4. );
  5. GO

(m, n) 不写,默认从 1 开始,步长为 1

  1. CREATE TABLE 表名
  2. (
  3. 列名 非数字类型 UNIQUEIDENTIFIER PRIMARY KEY
  4. );
  5. GO
  6. INSERT INTO 表名 VALUES(NEWID(), 列名)

NEWID() 唯一标识符只适合单机数据库和并发量小的情况