oracle 事务和数据库对象

事务

  1. 事务:在数据库领域,事务(Transaction)是指组成单个逻辑工作单元 的一系列操作,要么全部执行,要么全部不执行。
  2. 事务具有4个属性:原子性、一致性、隔离性、持久性。这四个属性通常称为ACID特性。
  3. 原子性(atomicity):一个事务是一个不可分割的工作单位, 事务中包括的诸操作要么都做,要么都不做。
  4. 一致性(consistency):事务必须是使数据库从一个一致性状态变到另一个一致性状态。 一致性与原子性是密切相关的。
  5. 隔离性(isolation):一个事务的执行不能被其他事务干扰。 即一个事务内部的操作及使用的数据对并发的其他事务是隔离的, 并发执行的各个事务之间不能互相干扰。
  6. 持久性(durability)。持久性也称永久性(permanence), 指一个事务一旦提交,它对数据库中数据的改变就应该是永久性的。 接下来的其他操作或故障不应该对其有任何影响。
  7. 涉及事务的命令
    • 查看提交方式:show autocommit;
    • 设置为自动提交:set autocommit on;
    • 设置为手动提交:set autocommit off;
    • 提交事务:commit;
    • 回滚事务:rollback;
    • 设置保存点:savepoint 保存点名
    • 回滚事务到指定保存点:rollback to 保存点名

数据库对象

  1. 数据库对象是数据库中信息存储、组织和管理的基本知识, 具体包括表、约束、视图、索引、序列、存储过程、触发器、数据库用户等。
  2. 表:存放数据的基本数据库对象,由行(记录)和列(字段)组成。
  3. 约束(Constraints):是在表上强制执行的数据校验规则, 用于保证数据的完整性。如果DML操作所涉及数据违反了已定义的约束, 则数据库系统将拒绝执行这样的操作。
  4. 约束分为非空约束、唯一性约束、主键约束、外键约束和检查约束。
    • 非空(not null)约束用于确保字段值不能为空(null), 如果在表中某个字段上施加了非空约束, 在插入新记录时该字段显示指定非空的数据, 在更新数据时也不允许将字段的值设为null。
      create table student(
      id number(3),
      name varchar2(20) not null
      );
    • 唯一性(unique)约束用于确保其所约束的字段不出现重复的值。
      create table student(
      id number(3) unique,
      name varchar2(20) not null
      );
    • 主键(primary key)用于唯一标识表中的某一行记录, 其功能上相当于非空且唯一,一个表中只允许一个主键, 主键可以是单个字段或多字段的组合(联合主键), Oracle会自动为主键字段创建对应的唯一性索引。
      create table student(
      id number(3) primary key,
      name varchar2(20) not null
      );
      联合主键
      create table student(
      id number(3),
      name varchar2(20),
      age number(3),
      constraint pk primary key(id, name)
      );
    • 外键(foreign key)约束用于确保相关的两个字段之间的参照关系,
      以实现参照完整性约束;外键约束通常构建于来自不同表的两个字段之间。
      create table class_(
      cid number(3) primary key,
      cname varchar2(20)
      );
      create table student(
      sid number(3) primary key,
      sname varchar2(20),
      cid number(3) references class_(cid)
      );

      create table student(
      sid number(3) primary key,
      sname varchar2(20),
      cid number(3),
      constraint fk foreign key(cid) references class_(cid)
      );
  5. 视图:是一个虚拟表,其内容由查询定义。 同真实的表一样,视图包含一系列带有名称的列和行数据。 但是,视图并不在数据库中以存储的数据值集形式存在。 行和列数据来自由定义视图的查询所引用的表,并且在引用视图时动态生成。
    • 创建视图(用system登录,scott用户没有创建视图的权限) 数据文件
      create [or replace] view stu(sid, sname) as select id, name from student;
    • 查询视图
      select * from stu;
    • 删除视图
      drop view stu;
    • 重新编译视图
      alter view stu compile;
      (当视图的基表结构发生了变化时, 视图的状态会被标记为无效。当用户再访问该视图时, Oracle会自动重新编译该视图。 但是为了避免可能的运行错误,最好手工编译视图)
    • 创建复杂视图
      create view stu(sid, sname, sage, sclass) as select id, name, age, cname from student s, class_ c where s.cid = c.cid;
  6. 索引:使用索引可快速访问数据库表中的特定信息。 索引是对数据库表中一列或多列的值进行排序的一种结构; 在关系数据库中,索引是一种与表有关的数据库结构, 它可以使对应于表的SQL语句执行得更快。 索引的作用相当于图书的目录,可以根据目录中的页码快速找到所需的内容。
    • 创建索引:
      create index idx_student_name on student(name) tablespace users;
    • 查询索引:
      对于系统中已经存在的索引我们可以通过以下 的两个系统视图(user_indexes和user_ind_columns)来查看其具体内容, 例如是属于那个表,哪个列和,具体有些什么参数等等。
      user_indexes:系统视图存放是索引的名称以及该索引是否是唯一索引等信息。 
      user_ind_column:系统视图存放的是索引名称,对应的表和列等。
      查看索引个数和类别:
      SQL> select * from user_indexes where table='表名' ;
      查看索引被索引的字段:
      SQL> select * from user_ind_columns where index_name=upper('索引名');
    • 什么情况下应不建或少建索引:
      A.表记录太少
      如果一个表只有5条记录,采用索引去访问记录的话,那首先需访问索引表,再通过索引表访问数据表,一般索引表与数据表不在同一个数据块,这种情况下ORACLE至少要往返读取数据块两次。而不用索引的情况下ORACLE会将所有的数据一次读出,处理速度显然会比用索引快。
      B.经常插入、删除、修改的表
      对一些经常处理的业务表应在查询允许的情况下尽量减少索引, 如zl_yhbm,gc_dfss,gc_dfys,gc_fpdy等业务表。
      C.数据重复且分布平均的表字段
      假如一个表有10万行记录,有一个字段A只有T和F两种值,且每个值的分布概率大约为50%,那么对这种表A字段建索引一般不会提高数据库的查询速度。
  7. 序列: 是oacle提供的用于产生一系列唯一数字的数据库对象。主要用于提供主键值。
    • 创建序列的语法:
      CREATE SEQUENCE sequence //创建序列名称
      [INCREMENT BY n] //递增的序列值是n 如果n是正数就递增, 如果是负数就递减 默认是1
      [START WITH n] //开始的值,递增默认是minvalue 递减是maxvalue
      [{MAXVALUE n | NOMAXVALUE}] //最大值
      [{MINVALUE n | NOMINVALUE}] //最小值
      [{CYCLE | NOCYCLE}] //循环/不循环
      [{CACHE n | NOCACHE}];//分配并存入到内存中
    • NEXTVAL 返回序列中下一个有效的值,任何用户都可以引用
      select 序列名.nextval from dual;
    • CURRVAL 中存放序列的当前值
      select 序列名.currval from dual;
    • 删除序列:drop sequence 序列名
  8. 存储过程(Stored Procedure):是在大型数据库系统中,一组为了完成特定功能的SQL 语句集,存储在数据库中,经过第一次编译后再次调用不需要再次编译,用户通过指定存储过程的名字并给出参数(如果该存储过程带有参数)来执行它。
    • 创建存储过程语法格式:
      create procedure sp_name
      (@[参数名] [类型],@[参数名] [类型])
      as
      begin
      ......
      end;
    • 删除存储过程:drop procedure sp_name
    • 调用存储过程:exec sp_name (参数列表)
    • 举例:
      创建表
      create table student(
      id number(6) primary key,
      name varchar2(20),
      age number(3)
      );
      创建序列
      create sequence seq_student;
      创建存储过程
      create procedure sp_insert(p_name varchar2, p_age number)
      as
      begin
      insert into student values(seq_student.nextval, p_name, p_age);
      commit;
      end;
      调用存储过程
      exec sp_insert('tom', 12);
      /
  9. 触发器(trigger)是SQL server 提供给程序员和数据分析员来保证数据完整性的一种方法,它是与表事件相关的特殊的存储过程,它的执行不是由程序调用,也不是手工启动,而是由事件来触发,比如当对一个表进行操作( insert,delete, update)时就会激活它执行。触发器经常用于加强数据的完整性约束和业务规则等。 触发器可以从 DBA_TRIGGERS ,USER_TRIGGERS 数据字典中查到
    举例:
    两张表users和log:
    create table users(
    id number(6) primary key,
    name varchar2(20)
    );
    create table log(
    content varchar2(50),
    insert_date date default sysdate
    ); 创建触发器(当往users表中插入一条数据时,触发器触发)
    create trigger tg_fengqing
    after insert on users
    for each row
    begin
    insert into log(content) values('a user is inserted');
    end;
    /

猜你喜欢

转载自blog.csdn.net/fengqing5578/article/details/80620004