Oracle数据中的序列、索引、视图、事务操作

简介: Oracle数据中的序列、索引、视图、事务操作详解以及rowid 和 rownum的简单介绍(绝对干货!)

1. 序列(sequence)

序列是 Oracle 中特有的对象, 用于生成一个自动递增的数列. 通常被用来作为主键的值.

1.1 创建序列

a) 语法

create sequence seq_name  
increment by n  
start with n  
maxvalue n|nomaxvalue // 10^27 or -1  
minvalue n|no minvalue  
cycle|nocycle  
cache n|nocache] 
解释:
**increment by, 代表每次增长的步长, 默认是 1, 可以是负数, 表示每次递减;
start with, 从哪个值开始, 默认是 1;
maxvalue, 序列能到达的最大值
nomaxvalue, 此时正数最大值是 10^27, 负数最大值是-1;
minvalue, 序列能到达的最小值 , 默认值是nominvalue, 此时正数的最小值是 1, 负数的最小值是-10^26;
cycle|nocycle, 表示是否循环. 如果是 cycle, 达到最大值时会重新从头开始, 如果是 nocycle, 最大值后会报错.
cache n|nocache, 表示高速缓存, 可以优化序列, 缓存的默认值是 20. nocache 表示没有缓存.**

b) 创建学生序列

create sequence seq_student; 

1.2 序列的使用

1.2.1 nextval(序列的下一个值)

查看序列的下一个值

select seq_student.nextval from dual; 

1.2.2 currval(序列的当前值)

查看序列的当前值

select seq_student.currval from dual; 

1.2.3 在插入数据时使用序列

insert into student values (seq_student.nextval, '小红', '女', 19, sysdate, 'hong@sxt.com', 102); 

1.3 删除序列

drop sequence seq_student;

ps:
-- 清空表格(保留表结构,注意与drop区别)

truncate table student;

2. 索引(index)

为了提高查询效率, 可以建立类似目录的数据库对象, 实现数据快速查询, 这就是索引(Index)

2.1 索引的创建

2.1.1 自动创建

Oracle 对 primary key 和 unique 约束的列, 会自动创建索引.

2.1.2 手动创建

对于不是 primary key 和 unique 约束的列, 如果经常会被查询或用于排序, 可以手动给其创建索引, 例如:
create index idx_sname on student (sname desc); 

2.2 索引的使用

索引被创建后, 查询时会自动生效, 提高查询效率.

2.3 索引的删除

drop index idx_sname; 

2.4 索引的优缺点

2.4.1 优点

当数据量比较庞大时, 索引可以大大提高查询的效率

2.4.2 缺点

a) 索引会单独存放, 索引过多会占用大量的存储空间;
b) 索引会降低 DML 的效率, 因为数据发生变化时, 还需要重新维护索引;
c) 对于唯一性不好的数据, 不适合创建索引.

3. 视图(view)

视图是从若干基本表和(或)其他视图构造出来的表.
视图中并不会存放数据, 只会存放视图的定义语句.
在用户使用视图时, 才去动态检索数据.

3.1 创建视图

a) 语法

create [or replace] view 视图名 as (查询) [with read only]

b) 创建简单视图

create or replace view v_student as (select * from student); 

c) 可以对视图进行 DQL 和 DML 操作

3.2 查询视图

 `select * from v_student;` 

3.3新增视图

insert into v_student values (seq_student.nextval, '小刚', '男', 20,
 sysdate, 'gang@sxt.com', 102); 

## 3.4 修改视图

update v_student set age=21 where sno=2;

3.5 删除视图

 delete from v_student where sno=2; 

3.6 只读视图

只读视图, 只能对视图进行查询(DQL)操作, 不能执行增删
改(DML)操作 (with read only)
create or replace view v_student as (select * from student) with read only; 
 

在这里插入图片描述

3.7 视图的作用

在这里插入图片描述
在这里插入图片描述

4. 事务(Transaction)

**事务(Transaction)是一个操作序列。
这些操作要么都做, 要么都不做, 是一个不可分割的工作单元,
是数据库环境中的最小工作单元。**

4.1 事务的特性(ACID)

4.1.1 Atomicity(原子性)

原子性是指事务包含的所有操作要么全部成功, 要么全部失
败回滚, 因此事务的操作如果成功就必须要完全应用到数据
库, 如果操作失败则不能对数据库有任何影响.

4.1.2 Consistency(一致性)

一致性是指事务必须使数据库从一个一致性状态变换到另
一个一致性状态, 也就是说一个事务执行之前和执行之后都
必须处于一致性状态.

4.1.3 Isolation(隔离性)

隔离性是当多个用户并发访问数据库时, 比如操作同一张表
时, 数据库为每一个用户开启的事务, 不能被其他事务的操
作所干扰, 多个并发事务之间要相互隔离.

4.1.4 Durability(持久性)

持久性是指一个事务一旦被提交了, 那么对数据库中的数据
的改变就是永久性的, 即便是在数据库系统遇到故障的情况
下也不会丢失提交事务的操作.

4.2 事务的提交和回滚

a) 提交, 在确保事务执行成功时, 应该将事务进行提交. 提
交后, 数据被永久保存, 不能进行回滚.
commit;
b) 回滚, 当事务执行出现故障时, 应该进行事务的回滚操作,
本次事务的所有操作将被还原, 保证数据库的一致性.
Rollback

5. rowid 和 rownum

5.1 rowid

a) rowid 在记录创建时生成,而且是不变,直接指向硬件上
的存储位置
b) 通过 rowid 查询是效率最高的, 但是 rowid 是由 Oracle
维护的, 人力无法做到

5.2 rownum

rownum 是一个伪列, 查询的时候除非特别指定,否则不会显
示. 表示行号, 常用于控制查询返回的行数.

5.2.1 通过 rownum 进行 TOP-N 查询

当 rownum 和 order by 一起使用时,会首先选出符合 rownum
条件的记录,然后再进行排序. 因此, 需要用子查询来完成.

例如: 查询工资排名前 5 的员工信息

select * from (      
select e.* from emp e order by sal desc
) where rownum<=5;

5.2.2 通过 rownum 进行分页查询

由于先要进行 where 条件判断, 满足条件后才能生成rownum, 所以导致 rownum 无法进行大于(>)和大于等于(>=)的判断. 此时, 需要使用嵌套子查询来实现.

例如: 分页查询员工信息, 按工资降序排序. 用 page 表示当前页数, size 表示每页显示的记录数, 则分页查询语句为:

select * from (       
select rownum rn, t.*       
from (            
select * from emp order by sal desc       
) t       
where rownum<=page*size ) tt 
where tt.rn>(page-1)*size;

相关文章
|
存储 Oracle 关系型数据库
【YashanDB 知识库】YMP 校验从 yashandb 同步到 oracle 的数据时,字段 timestamp(0) 出现不一致
在YMP校验过程中,从yashandb同步至Oracle的数据出现timestamp(0)字段不一致问题。原因是yashandb的timestamp(x)存储为固定6位小数,而Oracle的timestamp(0)无小数位,同步时会截断yashandb的6位小数,导致数据差异。受影响版本:yashandb 23.2.7.101、YMP 23.3.1.3、YDS联调版本。此问题会导致YMP校验数据内容不一致。
|
Oracle 关系型数据库 Linux
【YashanDB 知识库】通过 dblink 查询 Oracle 数据时报 YAS-07301 异常
客户在使用 YashanDB 通过 yasql 查询 Oracle 数据时,遇到 `YAS-07301 external module timeout` 异常,导致 dblink 功能无法正常使用,影响所有 YashanDB 版本。原因是操作系统资源紧张,无法 fork 新子进程。解决方法包括释放内存、停掉不必要的进程或增大进程数上限。分析发现异常源于 system() 函数调用失败,返回 -1,通常是因为 fork() 失败。未来 YashanDB 将优化日志信息以更好地诊断类似问题。
|
Oracle 关系型数据库 Java
【YashanDB知识库】Flink CDC实时同步Oracle数据到崖山
本文介绍通过Flink CDC实现Oracle数据实时同步至崖山数据库(YashanDB)的方法,支持全量与增量同步,并涵盖新增、修改和删除的DML操作。内容包括环境准备(如JDK、Flink版本等)、Oracle日志归档启用、用户权限配置、增量日志记录设置、元数据迁移、Flink安装与配置、生成Flink SQL文件、Streampark部署,以及创建和启动实时同步任务的具体步骤。适合需要跨数据库实时同步方案的技术人员参考。
【YashanDB知识库】Flink CDC实时同步Oracle数据到崖山
|
存储 Oracle 关系型数据库
【YashanDB 知识库】YMP 校验从 yashandb 同步到 oracle 的数据时,字段 timestamp(0) 出现不一致
【YashanDB 知识库】YMP 校验从 yashandb 同步到 oracle 的数据时,字段 timestamp(0) 出现不一致
|
SQL Oracle 关系型数据库
【赵渝强老师】Oracle的闪回事务查询
Oracle数据库的闪回事务查询(Flashback Transaction Query)是闪回版本查询的扩充,可用于审计或撤销已提交的事务。通过`flashback_transaction_query`视图,可生成还原特定事务的SQL语句。本文介绍了其基本概念,并通过实战演示如何使用该功能:从授权、开启UNDO数据增强,到创建测试表和事务,最后利用闪回查询撤销已提交的事务,验证数据恢复效果。附带视频讲解,帮助深入理解。
577 3
|
Oracle 关系型数据库 Linux
【YashanDB知识库】通过dblink查询Oracle数据时报YAS-07301异常
【YashanDB知识库】通过dblink查询Oracle数据时报YAS-07301异常
|
Oracle 关系型数据库 Linux
【YashanDB 知识库】通过 dblink 查询 Oracle 数据时报 YAS-07301 异常
某客户在使用 YashanDB 通过 yasql 查询 Oracle 数据时,遇到 `YAS-07301 external module timeout` 异常,导致 dblink 功能无法正常使用,影响所有版本。问题源于操作系统资源紧张,无法 fork 新子进程。解决方法包括释放内存、停掉不必要的进程或增大进程数上限。分析发现异常原因为系统调用 fork() 失败。经验总结:优化日志记录,提供更多异常信息。
|
存储 Oracle 关系型数据库
【赵渝强老师】Oracle的还原数据
Oracle数据库中的还原数据(也称为undo数据或撤销数据)存储在还原表空间中,主要用于支持查询的一致性读取、实现闪回技术和恢复失败的事务。文章通过示例详细介绍了还原数据的工作原理和应用场景。
400 2
【赵渝强老师】Oracle的还原数据
|
存储 Oracle 关系型数据库
【YashanDB知识库】YMP校验从yashandb同步到oracle的数据时,字段timestamp(0)出现不一致
【YashanDB知识库】YMP校验从yashandb同步到oracle的数据时,字段timestamp(0)出现不一致
|
SQL Oracle 关系型数据库
【赵渝强老师】Oracle的联机重做日志文件与数据写入过程
在Oracle数据库中,联机重做日志文件记录了数据库的变化,用于实例恢复。每个数据库有多组联机重做日志,每组建议至少有两个成员。通过SQL语句可查看日志文件信息。视频讲解和示意图进一步解释了这一过程。
474 0

推荐镜像

更多