欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

20180331:Oracle中的视图(view)、索引(index)、约束(constraint)、序列(sequence)

程序员文章站 2024-01-20 18:54:40
...

一、视图

视图是一个虚拟表,他由存储的查询构成,可以将它的输出看作是一个表,视图同真的表一样,也可以包含一系列带有名称的列和行数据。但是,视图并不在数据库中存储数据值,其数据值来自定义视图的查询语句所引用的表,数据库只在数据字典中存储视图的定义信息。
通过视图修改数据时,实际上就是在修改基本表中的数据。与之对应,改变基本表中的数据也会反映到该表组成的视图中。

创建视图
create [or replace] view <view_name>
[alias,...]
as <subquery>
[with check option] [constraint constraint_name]
[with read only]
查询视图

用户可以通过select语句像查询普通的数据表一样查询视图的信息。

例:在SCOTT模式下,通过select语句查询视图emp_view: select * from emp_view

更新视图

可更新视图要满足以下条件:

  • 没有使用连接函数、聚合函数、和组函数;
  • 创建视图的select语句中没有聚合函数且没有group by、onnect start with子句以及distinct关键字;
  • 创建视图select语句不包括从基表列通过计算所得的列:
  • 创建视图没有包含只读属性;

使用update语句可以通过视图修改基本表的数据

例:将emp_view_complex视图中员工编号是7566的员工的工资改为3000:
update emp_view_complex set sal=3000 where empno=7566;

删除视图

当视图不再需要时,用户可以执行drop view语句删除视图,用户可以直接删除其自身模式中的视图,但如果要删除其他模式下的视图,要求该用户必须具有drop any view系统权限

例:drop view emp_view

二、索引

数据库中引出索引的原因:如果要在表中查询指定的记录,,在没有索引的情况下,必须遍历整个表,而有了索引之后,只需要在索引中找到符合查询条件的索引字段值,就可以通过保存在索引中的rowid快速找到表中对应的记录。

建立索引的注意事项:
1.索引应该建立在where子句频繁引用表列上,如果在大表上频繁使用某列或某几个列作为条件执行索引操作,并且检索行数低于总行数15%,那么应该考虑在这些列上建立索引;
2.限制表中的索引个数,索引主要用于加快查询速度,但会降低DML操作的速度,索引越多,DML操作速度越慢,尤其会极大地影响insert和delete操作的速度,因此,规划索引时,必须仔细权衡查询和DML的需求;
3.将表和索引部署到相同的表空间,将表和索引部署到不同的表空间,可以提高访问性能;
4.为了提高多表连接的性能,应该在连接列上建立索引。

创建索引(MySQL的默认索引是B树索引)

20180331:Oracle中的视图(view)、索引(index)、约束(constraint)、序列(sequence)

上图为B树索引的简单安排。

创建B树索引的语法:
create index 索引名 on 表名 (列明[asc|desc]);
20180331:Oracle中的视图(view)、索引(index)、约束(constraint)、序列(sequence)

创建位图索引的语法:

create bitmap index 索引名 on 表名 (列明[asc|desc]);

三、约束

约束这里就不过多叙述了,大概就是非空约束(not null),主键约束(primary key),外键约束(foreign key),检查约束什么的了。

四、序列

创建序列

使用create sequence语句创建序列的语法:

create sequence seq_name
[start with n]
[increment by n]
[minvalue n | nomaxvalue]
[cache n| nocycle]
[cycle | nocycle]
[order | no order];

序列有两个”伪列”:nextval序列将要产生的下一个数字;curval序列当前值

管理序列

使用alter sequence语句可以对序列进行修改,需要注意,除了序列的起始值start with不能被修改外,其他可以设置序列的任何子句和参数都可以被修改,如果要修改序列的起始值,则必须先删除序列,然后重构该序列;

这里创建一个序列,作为主键id

创建一个学生表,其中的sid作为主键,利用序列和触发器可以实现Oracle中的主键自增效果:

create table student(
sid int primary key,
sname varchar2(20)
);

创建序列:

create sequence myseq
start with 1
increment by 1;

向学生表中插入一条数据:

insert into student values(myseq.nextval,'小明');
insert into student values(myseq.nextval,'小哥');

最后查询student表,如下:

20180331:Oracle中的视图(view)、索引(index)、约束(constraint)、序列(sequence)

这里需要注意一点,在Oracle中使用序列时系统使用了一种“延迟段”技术,插入数据时会跳过序列的第一个值,因此,在插入语句后,序列会跳过第一个值,所以有时会从2开始,这里只需更改数据库的”延迟段创建”特性即可,在system模式下修改:

alter system set deferred_segment_creation=false;