数据库对象——触发器、索引


触发器

什么是触发器?

  • 触发器是一种过程,与表关系密切,用于保护表中的数据。

  • 当一个基表被修改(INSERT、UPDATE或DELETE)时,触发器自动执行。

  • 触发器可实现多个表之间数据的一致性和完整性。

触发器的类型

触发器的类型有三种:DML触发器,替代触发器,系统触发器。

DML触发器

Oracle可以在DML语句进行触发,可以在DML操作前或操作后进行触发,并且可以对每个行或语句或操作上进行触发

替代触发器

由于在Oracle里,不能直接对由两个以上的表简历的视图进行操作。所以给出了替代触发器。它就是Oracle 8 专门为进行视图操作的一种处理方法。

系统触发器

Oracle 从8i开始,提供了第三种类型的触发器叫系统触发器。它可以在ORACLE数据库系统的事件中进行触发,如ORACLE系统的启动与关闭等。

触发器的创建

触发器创建语法

这里写图片描述

创建DML触发器

  • DML触发器由DML语句激发,并且由该语句的类型决定DML触发器的类型

  • 可以定义DML触发器进行insert、update、delete操作。

  • DML触发器可以在上述操作之前或之后激发,也可以在运行或语句操作上激发。

这里写图片描述

触发器中使用谓词

谓词用来判断用户所执行的DML语句的类型.

  • inserting
  • updating
  • deleting

这里写图片描述

触发器的修改与删除

--触发器的禁用
alter trigger emp_sal_trigger disable;

--启用触发器
alter trigger emp_sal_trigger enable;

--删除触发器
drop trigger XXXXX;

--查询当前用户的所有触发器
select * from user_triggers;

练习:行级触发器

题目要求:
–当有人的工资发生改变时,需要做记录.
当公司多了雇员的时候,添加记录中只有新的工资
当有人离职时,需要把该员工工资修改记录删除

create or replace trigger emp_sal_trigger
after update or insert or delete on emp1
for each row  --行级触发器
begin
  if updating
    then insert into emp_sal values(:old.empno,:new.sal,:old.sal,sysdate,emp_sal_seq.nextval);
  ELSIF inserting
    then insert into emp_sal values(:new.empno,:new.sal,0,sysdate,emp_sal_seq.nextval);
  else 
    delete from emp_sal where empno=:old.empno;
  end if;
exception
  when others then dbms_output.put_line('添加失败!');
end;

练习:要求工资只能增加不能降低

create or replace trigger keep_sal_trigger
before update on emp1
for each row
begin
  if :new.sal<:old.sal
      then :new.sal:=:old.sal;
  end if;
end;

索引

索引:

可以建立类似目录的数据库对象,实现数据快速查询。

索引的分类

按照索引的存储结构分类

B树索引
位图索引
反向键索引

按照索引值是否唯一分类

唯一索引
非唯一索引

按索引分类

单列索引
组合索引
基于函数的索引

索引语法

这里写图片描述

实例:索引练习

这里写图片描述

建立索引的特点

  • 经常需要搜索的列
  • 主键列
  • 经常用在连接的列
  • 经常需要根据范围搜索的列
  • 经常需要排序的列
  • 经常出现在where子句的列

不应该建立索引的列

  • 查询中很少使用或者参考的列
  • 只有很少数据值的列
  • 定义为lob类型的列
  • 修改性能远远大于检索性能

避免限制索引

  • 避免使用不等操作符(<>、!=)
  • 避免使用is null is not null
  • 避免在where子句中使用函数
  • 避免在比较时使用不匹配的数据类型
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值