触发器
为什么要使用触发器
只要一变动表结构就要记录所有操作到一个审计表中
不需要显式调用来执行,而是修改表结构的操作来启动运行
Oracle 事件
INSERT、UPDATE 及DELETE 操作或对视图进行类似的操作
执行DDL操作
数据库的启动与关闭
触发器由三部分组成:
触发器语句(事件)
定义激活触发器的 DML 事件和 DDL 事件
触发器限制
执行触发器的条件,该条件必须为真才能激活触发器
触发器操作(主体)
包含一些 SQL 语句和代码,它们在发出了触发器语句且触发限制的值为真时运行
DML 触发器
--复制表结构
-- 创建审计表(记录emp中删除掉的数据)
create table del_emp
as
select * from emp where 1=2;
-- 创建触发器(trigger)
create or replace trigger del_emp_trigger
before delete on emp -- 触发事件
for each row -- 触发类型(行级触发器)
when (old.dno <>50)-- 触发器的条件限制
begin
-- 触发器的主体操作(触发器执行后做什么)
-- 将emp表中删除掉的数据备份在审计表中(del_emp)
insert into del_emp
values(:old.empno,:old.ename,:old.job,:old.salary,:old.bonus,:old.hiredate,:old.sex,:old.age,:old.dno);
end;
序列(Sequence)
-- 为了实现唯一标识的 自增的
-- 一般用于主键自增的 auto_increment
创建序列
create sequence my_seq start with 1 increment 2
create table test_sq(id number primary key, name varchar2(20));
insert into test_seq values(my_seq.nextval,'ccc'); //主键间隔2增加,插下一个值
select * from test_seq;
delete from test_seq;
select my_seq.nextval from dual;
-- 如果没有写increment默认是自增1
-- 没有写start with 从1开始
视图(view):有名字的结果集
-- 本质就是一条select语句 依赖表 虚表
作用:
-- 控制某些列的访问
-- 提升性能
-- 简化查询 把经常查询的数据放在view里
注:表被drop了 视图就没有意义(非法了)了.
-- 创建视图
create view my_view
as
select empno,ename,job,age,sex,hiredate,dno from emp;
create view my_2_view
as
select dno ,avg(salary) from emp where dno= 10;
--简单视图(单表)
create view my_2_view
as
select avg(salary)avg_sal from emp where dno=10;
-- 复杂视图(多表)
create view my_3_view
as
select d.dname name,count(e.empno) count
from emp e,dept d where
e.dno=d.dno group by d.dname;
select * from my_3_view ;
-- 删除表 drop view 视图名;
索引:index
-- 提升查询性能的(降低查询的次数)
-- 索引不是万能的
-- 索引的分类: 列 表达式 函数
-- 位图索引(位图机制)
-- 唯一索引(主键列 默认加上了唯一索引)
-- B树(二叉树)索引
--创建索引(树索引)
create index my_index_2 on emp(job);
索引的使用原则
- 表的基数很大 但是select的数据量很少(<15%)
- 表的数据全部导入了 以后很少做修改操作
- 限制索引的数量 不是越多越好 因为表的数据更新
- 索引也需要同时做维护.
- 经常用于查询的列上或者表达式上
为什么要使用触发器