##约束
约束: Constraint,是定义在“表对象”上的强制规则。
在Oracle数据库中,可以为表设置约束,当为某个表定义了约束后,对该表做的所有操作都必须满足约束的要求,否则操作将失败。
约束作用:Oracle服务器用约束来防止无效数据输入到表中,可以使用约束做下面的事:
- 在插入、更新行或者从表中删除行的时候强制表中的数据遵循规则,对于成功的操作,约束必须被满足。
- 表之间有依赖关系,可以防止表记录的删除。
约束类型
约束命名规则
约束也是数据库对象,必须按照命名规则命名,如果你不命名约束,Oracle服务器将用SYS_Cn格式产生一个名字,这里n是一个唯一的整数。
除了NOT NULL约束外,建议给其它约束起名字,命名规则为:表名_列名_约束类型。
#定义约束
- 约束通常在创建表的同时被创建;
- 在表被创建后,如果有需求也可以临时添加约束;
- 约束可以被临时禁用和启用。
列级约束:只能引用一个列,属于列的定义
表级约束:可引用一个或多个列,属于表定义,可以定义为除NOT NULL 以外的其它约束。
#NOT NULL 约束
NOT NULL约束 :也叫非空约束,确保被约束列的所有行记录都不能为空值。
NOT NULL约束只能定义在在列级上。
例子里应用NOT NULL约束到emp_nn表的ename,deptno列,因为对这两个列的约束未被命名,Oracle服务器将为它创建名字。
在指定约束时,也可以指定约束的名字:... ename VARCHAR2(20) CONSTRAINT emp_ename_nn NOT NULL...
#UNIQUE 约束
UNIQUE约束:也叫唯一约束,用来确保表中的某一列或者某几列组合的所有行数据必须唯一,定义UNIQUE约束的列 (或列组合) 被称为唯一键。
每个表可以有多个为UNIQUE约束。
可以定义在列一级:
也可以定义在表一级:
UNIQUE约束允许输入空值,除非我们在相应的列上定义NOT NULL 约束。
#PRIMARY KEY 约束
PRIMARY KEY约束:主键约束,用来确保表中的某一列或者某几列组合的所有行数据必须唯一,并且确保作为主键一部分的列不能包含空值;
每个表只能创建一个主键约束。
可以定义在列一级
也可以定义在表一级
#FOREIGN KEY 约束
FOREIGN KEY,也叫外键约束,外键确保了相关联的两个字段的关系: 外键列的值必须在主键表参照列值的范围内,或者为空; 外键参照的是列必须是主键或者唯一键;
主键表主键值被外键表参照时,主键表记录不允许被删除。
可以定义在列一级
也可以定义在表一级
FOREIGN KEY: 定义在子表的列中
REFERENCES: 引用列所在的父表
注: ON DELETE CASCADE:当父表中的行被删除时,子表中相依赖的行同时被删除;
ON DELETE SET NULL:当父表的行被删除时,子表中相依赖的行被转换为空值;
无ON DELETE CASCADE或ON DELETE SET NULL选项,当附表中的行被删除时,如果父表中的行在子表中被引用,则提示不能被删除。
#CHECK 约束
CHECK约束,也叫检查性约束,确保某个列的所有行数据都必须满足的条件,
如: sal NUMBER(8,2) CONSTRAINT dept_sal_min CHECK (salary > 0) 要求sal字段的所有行数据必须大于0
表达式不允许使用:
- 伪列,例如: CURRVAL, NEXTVAL, LEVEL及 ROWNUM;
- 可以调用SYSDATE, UID, USER及 USERENV 函数;
- 对其它记录其它值的查询。
可以定义在列一级
也可以定义在表一级
##添加约束
也可以用ALTER TABLE语句为表:
- 添加或删除约束,但不修改它的结构;
- 启用或禁用约束;
- 用MODIFY子句添加一个NOT NULL约束;
你可以用带ADD子句的ALTER TABLE语句为已经存在的表添加一个约束,语法为:
在语法中:
- table 是表的名字
- constraint 是约束的名字
- type 是约束的类型
- column 是受约束影响的列的名字
添加FOREIGN KEY约束
添加 NOT NULL 约束
注:只有在表是空的或者每个行的该列都有非空值的情况下,你才可以添加一个NOT NULL约束。
##删除约束
在语法中:
- table 是表的名字
- column 是受约束影响的列的名字
- constraint 是约束的名字
- cascade 级联删除
从EMPLOYEES表中删除经理约束
删除DEPARTMENTS表上的PRIMARY KEY约束,并且删除相关联的在EMPLOYEES.DEPARTMENT_ID列上的FOREIGN KEY约束;
##约束启用与禁用
约束禁用
如果有大批量数据导入时,我们可以采用禁用约束的方法,主要的好处,首先效率高,另外有主外键约束的表之间导入时,不用考虑导入的先后顺序。
禁用约束语法:
启用约束语法:
#相关数据字典
相关数据字典 和约束相关的数据字典有:USER_CONSTRAINTS:查看表上所有的约束。USER_CONS_COLUMNS:查看与约束相关的列名,该视图对于那些由系统指定名字的约束特别有用。
在约束类型中,C代表CHECK,P代表PRIMARY KEY,R代表FOREIGN KEY, U代表UNIQUE,NOT NULL约束实际上是一个CHECK约束。
##本章重点总结
- 约束作用;
- 五种约束类型及含义:
- 约束的定义及追加。