首页 > 代码库 > 约束、视图、序列、伪列和索引

约束、视图、序列、伪列和索引

前言

约束条件用于保证数据的完整性。主要有主键约束(primary key)/非空约束(not null)、唯一约束(unique) 检查约束(check)和外键约束(foreign key).

正文

约束

主键约束(primary key)

主键约束包含了非空和唯一

create table 表名(字段名 字段类型(长度) 约束条件);

1.创建自定义名称约束

create table 表名(字段名 字段类型(长度),constraint 约束名 约束类型(字段名));

注:可以通过user_constraints数据字典来查询约束。

 

非空约束(not null)

 检查约束(check)

create table t_test(id number(10);sex char(2); constraint test_sex check (sex in(‘男‘,‘女’)));--可以通过在字段后面加 default 值,来设置默认值;在使用默认值时使用default关键字。

注:元组上的约束的定义

元组级别的限制可以设置不同属性之间取值的相互约束条件

check(ssex=‘女‘ or sname NOT like ‘MS.%‘);--当学生性别为男时,其名字不能以MS.开头。

 

外键约束(foreign key 字段名 references 表名(字段名)).

外键字段可以为空,或者引用自依赖的父项。

设置级联

1.赋予空值

foreign key(外键字段) references 表名(字段) on delete set null;

2.级联删除

foreign key(外键字段) references 表名(字段) on delete cascade;

联合主键

constraint pk_t_emp primary key (字段1,字段2);

DDL操作约束

alter table 表名 drop contraints 约束名称;

alter table 表名 add  contraints 约束名称 约束类型(字段);

alter table 表名 modify (字段 字段类型 要添加的约束);

视图

create or replace view 视图名 as select  * from emp;

注:

复杂视图的定义是,视图中的数据不能直接通过表获得,必须通过计算来获得;复杂视图的查询字段必须取别名。

序列

序列是数据库中特有的一组能够实现自动增长的数字。

create sequence 序列名 increment by  每次增长的步长 start with 起始值。

1.select 序列名.nextval from dual.--获取序列的下一个值;获取序列的当前值采用currval属性。

伪列

oracle特有的默认提供给每一个表的,以便实现某些功能。

rownum

表示每条记录的序号(查到结果集后才分配的序号),常常用于分页。

 

rowid

表示每条记录的唯一标识(一组32为的字符串),可用来获取记录的物理地址

例子1:删除表中的相同记录

方法一:

delete from  t_table t1 where t1.rowid!=(select max(rowid) from t_table t2 where t1.id=t2.id and t.name=t2.name);;--其中 t1.id=t2.id and t.name=t2.name是定义相同记录的条件

方法二:

delete from t_table where roeid not in(select  max(rowid) from t_table group by 字段一,字段二);

例子1:删除表中不重复的记录

delete from  t_table t1 where t1.rowid=(select max(rowid) from t_table t2 where t1.id=t2.id and t.name=t2.name) and t1.rowid=(select min(rowid) from t_table t2 where t1.id=t2.id and t.name=t2.name) ;

应用于分页

1.三目运算来计算总页数 totalpage=sum/pagesize+sum%pagesize==0?0:1;//计算总页数,sum为总记录数

2.第page页的记录的起始位置和结束位置分别为:

pagesize*(page-1)+1;起始位置

pagesize*page;j、结束位置

注:

1.可以使用差集(minus)在数据库查询中实现分页,但效率低‘

2.常用子查询将rownum作为另一结果集的字段来实现分页。

select ee.* from(select e.* , rownum rr from (select * from emp where sal is not  null order by sal ) e )ee where ee.rr berween &start and &end;

3.rownum的分页地java代码示例

<script src="https://code.csdn.net/snippets/339925.js" type="text/javascript"></script>

 

索引

快速的查找定位到某条记录(底层采用rowid来实现);没有索引查找时,将采用全表扫描(full table scan)

注:

1.查找索引可以使用user_indexes数据字典。

2数据库.默认为表中的主键和唯一键建立索引。

自定义索引

create index 索引名 on 表名(字段名);

不应该应用索引的情况

1.经常进行更新操作的字段

2.表小,查询结果集大

3.不常用的字段

应用索引的情况

1.经常用来查询的字段

2.当表的数据量很大且查询的结果集较小

3.当前字段值很多为空的字段

4.经常用来作为联合查询的字段

5.外键字段

数据字典

存储描述对象(表,序列、视图、触发器、过程、函数等)信息的表或视图称为数据字典。

user_XXX 表示当前用户的相关信息的数据字典

user_tables/user_constraints/user_indexes/user_sequences/user_views/user_objects

例如:select distinct object——type from user_objects;--查看所有的对象

user_all_XXX 当前用户所能访问的对象的数据字典

dba_xxx  当前数据库下得所有对象的数据字典

总结