一、约束概述
1.1 约束的作用
- 约束(CONSTRAINT)的全称是约束条件,也称作完整性约束条件
- 约束是在数据表上强制执行的一些数据校验规则,当执行DML操作时,数据必须符合这些规则,如果不符合则无法执行
- 约束条件可以保证表中数据的完整性,保证数据间的商业逻辑
1.2 约束的类型
约束条件包括:
- 非空约束(Not Null):简称NU
- 唯一性约束(Unique):简称UK
- 主键约束(Primary Key):简称PK
- 外键约束(Foreign Key):简称FK
- 检查约束(Check):简称CK
二、非空约束
2.1 建表时添加非空约束
- 非空约束用于确保字段值不为空
- 默认情况下,任何列都允许有空值,但业务逻辑可能会要求某些列不能取空值
- 当某个字段被设置了非空约束条件,这个字段中必须存在有效值
例如:
1.当执行INSERT操作时,必须提供这个列的数据
2.当执行UPDATE操作时,不能给这个列的值设置为NULL
CREATE TABLE employees(
eid NUMBER(6),
name VARCHAR2(30) NOT NULL, //最常见的写法
salary NUMBER(7,2),
hiredate DATE CONSTRAINT employees_hiredate_nn NOT NULL //最标准的格式
);
2.2 修改表时添加非空约束
- 可以在建表之后,通过修改表的定义,添加非空约束
ALTER TABLE employees MODIFY(eid NUMBER(6) NOT NULL );
2.3 取消非空约束
- 如果业务要求取消某列的非空约束,可以采用重建表或者修改表的方式
ALTER TABLE employees MODIFY(eid NUMBER(6) null);
三、唯一约束
3.1 什么是唯一性约束
- 唯一性(Unique)约束条件用于保证字段或者字段的组合不出现重复值
- 当给表的某个列定义了唯一约束条件,该列的值不允许重复,但允许是NULL值
- 唯一性约束条件可以在建表同时建立,也可以在建表以后再建立
3.2 添加唯一性约束
- 在建表employees的同时,在eid、email列上创建唯一约束条件,并在建表后在name列上建立一个名为employees_name_uk的唯一约束条件
CREATE TABLE employees(
eid NUMBER(6) UNIQUE,
name VARCHAR2(30),
email VARCHAR2(50),
salary NUMBER(7,2),
hiredate DATE,
CONSTRAINT employees_email_uk UNIQUE(email)
);
- 在建表之后添加唯一性约束条件:
ALTER TABLE employees
ADD CONSTRAINT employees_name_uk UNIQUE(name);
❤️ 出现的一个小BUG:
- 原因:查看表可知,name这一列已经有重复的值,如果再添加唯一性约束条件是不可以的。
- 解决方法:删掉重复值后再添加唯一性约束条件
四、主键约束
4.1 主键的意义
- 主键(Primary Key)约束条件从功能上看相当于非空(NOT NULL)且唯一(UNIQUE)的组合
- 主键字段可以是单字段或多字段组合,即:在主键约束下的单字段或者多字段组合上不允许有空值,也不允许有重复值
- 主键可以用来在表中唯一的确定一行数据
- 一个表上只允许建立一个主键,而其他约束条件则没有明确的个数限制
4.2 主键选取的原则
- 主键应是对系统无意义的数据
- 永远也不要更新主键,让主键除了唯一标识一行之外,再无其他的用途
- 主键不应包含动态变化的数据,如时间戳
- 主键应自动生成,不要人为干预,以免使它带有除了唯一标识一行以外的意义
- 主键尽量建立在单列上
4.3 添加主键约束
4.3.1 在建表时添加主键约束条件
CREATE TABLE employees2(
eid NUMBER(6) PRIMARY KEY,
name VARCHAR2(30),
email VARCHAR2(50),
salary NUMBER(7,2),
hiredate DATE
);
4.3.2 建表后创建主键约束条件
ALTER TABLE employees2
ADD CONSTRAINT employees2_eid_pk PRIMARY KEY(eid);