数据库表设计

一、视图

视图:

1、也称虚表,不占用物理空间。视图中的数据是从实际表中获得的。每次使用视图的时候,只是重新执行sql语句。

2、用于产生视图的表叫做该视图的基表,一个视图可以从另一个视图中产生。

3、在oracle中如果是只读视图的话,仅仅能查询基表中的数据;在其他视图中如果修改视图中的数据,基表的数据也会发生改变

4、在oracle数据库中存在物化视图,物化视图有两种:ON DEMAND(仅在该视图需要被刷新时在进行刷新操作,经常使用)、ON COMMIT(一旦基表有了数据提交就会刷新视图,太频繁)

视图的创建:

create [or replace] VIEW view AS 子查询 [WITH READ ONLY];

例如:create view v_emp as select * from emp where deptno = 10;

授权视图:

如果普通用户第一次创建视图,提示没有权限,要使用管理员去修改权限

1、sqlplus /nolog

2、conn sys/bjmsb@orcl as sysdba;

3、grant create view to scott; 

视图的使用:

select * from v_emp;

向视图中添加数据:(执行成功之后需要提交事务,绿色表示提交事务,红色表示回滚事务)

insert into v_emp(empno,ename) values(1111,'zhangsan');

  细节注意:当你执行插入sql,但未提交事务时,此时该数据已经插入到基表中(该数据为脏数据),使用当前会话能查到,但是使用其他会话查不到。

      执行结束sql语句只是将该条数据写入缓存空间中,但并未写入该表的数据文件中。提交事务只是将该条数据刷写到与该表对应的数据文件中。

如果定义的视图是非只读视图的话,可以通过视图向表中插入数据,如果是只读视图的,则不可以插入数据,只读视图只提供查询的需求,无法进行增删改操作

create view v_emp2 as select * from emp with read only;

删除视图,不会对基表中数据产生影响

drop view v_emp2;

当删除视图中的数据的时候,如果数据来源于多个基表,则此时不能全部进行删除,只能删除一个表中的数据

 二、序列

1、在oracle中如果需要完成一个列的自增操作,必须要使用序列

  create sequence seq_name

    increment by n 每次增长几

    start with n       从哪个值开始递增

    maxvalue ninomaxvalue 10^27 or -1  最大值

    minvalue nino minvalue                      最小值

    cycle|nocycle                  是否有循环

    cache ninocache       是否有缓存

2、查看当前序列的值:select my_sequence.currval from dual;

   获取序列的下一个值:select my_sequence.nextval from dual;

  注意:如果创建好序列之后,没有经过任何的使用,那么不能获取当前的值,必须要先执行nextval之后才能获取当前值

  使用序列:insert into emp(empno,ename) values(my_sequence.nextval,'hehe');

三、数据库操作语言

1、插入操作

  insert into tableName(xxx,yyy) values('aaa','bbb')

2、创建表的操作

  create table emp2 as select * from emp;  复制表同时复制表数据,不会复制约束

  create table emp3 as select * from emp where 1=2;  复制表结构,不复制数据,不复制约束

3、删除操作

  delete from tableName where condition;  条件删除

  delete from tableName;  删除整张表

  truncate table tableName;  删除整张表数据

  注意:truncate不经过事务,不能恢复,效率高,容易误操作。delete可以进行回滚操作

4、修改操作

  update tableName set col = val1,col = val2 where condition;

总结:增删改是数据库的常用操作,在进行操作的时候都要‘事务’的保证,事务变得非常关键

   最主要的目的是为了数据一致性

   如果同一份数据,在同一时刻只能一个人访问,就不会出现数据错乱的问题,但是在现在的项目中更多的是并发访问

   并发访问的同时带来的就是数据的不安全,也就是不一致

   如果要保证数据的安全,最主要的方式就是加锁的方式

原文地址:https://www.cnblogs.com/lyc-code/p/13466989.html