约束:constraint
概念:
约束是定义在表上的一种强制规则
作用:
当为某个表定义约束后,对该表所做的所有SQL操作都必须满足约束的规则要求,否则将操作失败
命名规则:表名_列名_约束类型
默认约束名:SYS_Cn,n是一个唯一的整数
约束分类:
1)主键约束(pk):primary key
概念:
主键约束,用来确保表中的某一列或者某几列组合的所有行数据必须唯一,并且确保作为主键一部分的列不能包含空值
PS:
唯一的,非空的,每张表主能创建一个主键约束,一个主键可以由多个列组成(联合主键),Oracle会自动添加唯一索引
2)唯一约束(uk):unique
概念:
唯一约束,用来确保表中的某一列或者某几列组合的所有行数据必须唯一,定义unique约束的列(或列组合)被称为唯一键
PS:
唯一的,允许为空,一张表可以有多个唯一约束,Oracle会自动添加唯一索引
3)非空约束:not null
非空约束,确保被约束列的的所有行记录都不能为空值
PS:
只能定义在列级别上
4)检查约束(ck):check
概念:
检查性约束,确保某个列的所有行数据必须满足的条件
PS:
1)表达式不能使用伪列,如:currval,nextval,level,rownum
2)表达式不能使用对其他记录其他值的查询
3)可以调用sysdate,uid,user和userenv
函数
5)外键约束(fk):foreign
概念:
外键约束,确保相关联的两个字段的关系:
-外键列的值必须在引用列值的范围内,或者为空
-外键参照的列必须是主键或者唯一键
PS:
主键表主键值被外键表参照时,主键表记录不允许被删除
6)列级约束:CONSTRAINT 约束名 约束类型
7)表级约束:CONSTRAINT 约束名 约束类型(约束列)
外键约束:
foreign key:定义在子表的列中
references:引用列所在的父表
1)ON DELETE CASCADE:
当父表中的行被删除时,子表中相依赖的行同时被删除;
2)ON DELETE SET NULL:
当父表的行被删除时,子表中相依赖的列值被转换为空值;
3)无ON DELETE CASCADE或)ON DELETE SET NULL选项,当父表中的行被删除时,如果父表中的行在子表中被引用,则提示不能被删除
约束操作:
1)定义约束:
约束通常在创建表的同时被创建
2)追加约束:
在表被创建后,如果有需求也可以临时添加约束,不修改表结构
语法:
ALTER TABLE 表名 ADD [CONSTRAINT 约束名] 约束类型(约束列);
3)删除约束:不修改表结构
语法:
ALTER TABLE 表名 DROP PRIMARY KEY|UNIQUE(column)|CONSTRAINT 约束名 [CASCADE];
4)启用约束:
约束可以被临时启用
语法:
ALTER TABLE 表名 ENABLE CONSTRAINT 约束名;
5)禁用约束:
约束可以被临时禁用
语法:
ALTER TABLE 表名 DISABLE CONSTRAINT 约束名 [CASCADE];
定义约束:
1)约束既可以写在每个对应列的后面,称之为列级别约束,一个列级别约束只能作用在一个列上
2)约束也可以在写完所有列之后,再写约束,称之为表级别约束,一个表级别约束既可以作用在一个列上,也可以作用在列的组合上
3)not null 约束只能定义在列级别上,联合主键或联合唯一性约束只能定义在表级别上,其他约束既可以定义成表级别,也可以定义成列级别
4)列级别约束和表级别约束达到的作用完全相同,只是书写的位置不同
数据字典:
1)USER_CONSTRAINTS:
查看表上所有的约束。
2)USER_CONS_COLUMNS:
查看与约束相关的列名,该字典对于那些由系统指定名字的约束特别有用。
3)在约束类型中,c代表check,p代表primary key,R代表foreign key,u代表unique,notnull约束实际上是一个check约束
视图(view):虚表,没有物理存储空间,对视图的操作都会作用在相应表上
概念:
视图是逻辑上来自一张表或多张表的数据的集合
分类:
1)简单视图:
只基于一张表,不能有组数据和组函数,可以进行DML操作
2)复杂视图:
基于一张表或者多张表,有组数据和组函数,不一定进行DML操作
作用:
1)限制其他用户对数据库表的访问,因为视图可以有选择性的显示数据库表的一部分
2)容易实现复杂查询
3)对于相同的数据可以产生不同的视图
视图操作:
1)创建视图:
语法:
CREATE [OR REPLACE] [FORCE|NOFORCE] VIEW 视图名
[(column[, column]...)]
AS 子查询
[WITH CHECK OPTION [CONSTRAINT constraintname]]
[WITH READ ONLY]
***********************************
OR REPLACE:
如果所创建的视图已经存在,该选项表示修改原始图的定义
FORCE:
不管视图所基于的基表是否存在,都会创建该视图
NOFORCE:
只有视图所基于的基表都存在,才会创建该视图
WITH CHECK OPTION:
一个约束条件,通过视图所插入或修改的数据行必须满足视图所定义的查询;
WITH READ ONLY:
只读,不能进行DML操作
2)修改视图:
语法:
CREATE OR REPLACE VIEW
3)删除视图:
语法:
drop view 视图名;
视图上执行DML操作的规则:
1)删除操作:视图中不能有以下情况
1-1)不能有组函数
1-2)不能有group by字句
1-3)不能有distinct
2)修改操作:视图中不能有以下情况
2-1)不能有组函数
2-2)不能有group by字句
2-3)不能有distinct
2-4)不能使用表达式定义的列
2-5)不能有rownum伪列
3)添加操作,视图中不能有一下情况
3-1)不能有组函数
3-2)不能有group by字句
3-3)不能有distinct
3-4)不能使用表达式定义的列
3-5)不能有rownum伪列
3-6)不能基表中未在试图中选择的其他列定义为非空并且没有默认值
数据字典表:
1)USER_VIEWS:
字典中包含了视图的定义。
2)USER_UPDATABLE_COLUMNS:
字典包含了哪些列可以更新、插入、删除。
3)USER_OBJECTS:
字典中包含了用户的对象。