1.序列
(oracle里面使用序列式主键增加)
是一数据库对象,利用它可生成唯一的整数。
一般使用序列自动地生成表主键值或唯一键值
不直接连接到数据库中的任何表
①语法
create sequence [user.]sequence_name
[increment by n]
[start with n]
[maxvalue n|]
[minvalue n ]
[cache]
[nocycle|cycle]
increment by: 指定序列号之间的间隔,该值可为正的或负的整数,但不可为0。序列为升序。忽略该子句时,缺省值为1。
start with:指定生成的第一个序列号。在升序时,序列可从比最小值大的值开始,缺省值为序列的最小值。对于降序,序列可由比最大值小的值开始,缺省值为序列的最大值。
maxvalue:指定序列可生成的最大值。
minvalue:指定序列的最小值
nocycle:一直累加,不循环
cycle:累加到最大值循环
一般只需要些第一个,其他都要默认值:(创建序列,需要序列的权限)
create sequence seq_test;
②mysql 和 oracle 主键递增的区别
mysql:在表结构里面存储了最大了索引(保存在磁盘中),每次添加都需要获取后,再之前的基础上加1,操作方便
不足:并发高的时候,可能两个线程同时获取索引,引发错误。
oracle:使用序列:利用缓存,提前将批量索引放在缓存里(默认20个),缓存在内存中,获取速度快。
优势:提高获取主键值的性能,出现大量并发的获取主键值,适当增加[cache]缓存大小
不足:1.序列值可能是不连续的。
2.为了保证每个表都用一个序列,所以需要建立多个序列
③获取序列
-获取当前序列值(第一次的时候没有值,会报错;有值后就不会报错了)
select seq_test.currval from dual;
--获取下一个序列的值
select seq_test.nextval from dual;
④使用序列插入表
insert into employees_bck(Employee_id,first_name,last_name) values(seq_test.nextval,'刘','星')
⑤查看用户定义的序列
查询部分信息
select t.sequence_name,t.min_value,t.max_value,
t.increment_by from user_sequences t;
查询所有信息
select t.* from user_sequences t;
⑥修改序列
修改序列:
ALTER SEQUENCE [user.]sequence_name [INCREMENT BY n] [MAXVALUE n] [MINVALUE n];
修改序列可以:
修改未来序列值的增量。
设置或撤消最小值或最大值。 ?
改变缓冲序列的数目。
指定序列号是否是有序。
注意:1,第一次NEXTVAL返回的是初始值
2,可以修改除start至以外的所有sequence参数.如果想要改变start值,必须 drop sequence 再 re-create .
例如:
alter sequence emp_seq
increment by 2
minvalue 3
maxvalue 99999
⑦删除序列
语法:
DROP SEQUENCE [user.]sequence_name;--用于从数据库中删除一序列。
例如:
Drop sequence emp_seq
2.索引
①索引阐述:
在 Oracle数据库中用来加速对表的查询
通过使用快速路径访问方法快速定位数据,减少了磁盘的I/O
与表独立存放
由 Oracle数据库自动维护
②哪些值可以创建索引?
1.外键一般要创建索引
2.经常使用的查询条件要创建索引。如果使用like ‘%’操作,不会使用索引。
like 'a% 'a_'会使用索引
like '%a' 不会使用索引,
通过反转索引,可实现利用索引:select * from employees where reverse(name) like reverse('%abc');
like '%a%' 不会使用索引,造成全表扫描,看数据库表的数量的大小,500万以下
解决查询效率方案:分库(读数据库,写数据库)
分表(往年数据变成一张只读表,今年的数据也是一张表)
3.索引不是越多越好,因为新的索引,会改变索引的存储顺序
4.不要在可选值很少的属性上面创建索引:性别等;
5.对于那些定义为text, image和bit数据类型的列不应该增加索引
6.当修改性能远远大于检索性能时,不应该创建索引(分库分表:把往年查询的数据放到一个只读的表空间)
③创建索引
语法:
在一列或者多列上创建索引.
CREATE INDEX index
ON table (column[, column]...);
例如:
create index index_role_name
on t_role(name);
④删除索引
DROP INDEX index;(index为索引)
为了删除索引,必须拥有索引或者拥有 DROP ANY INDEX 权限
3.视图
①理解
视图也就是虚表,实际上视图就是一个命名的查询,用于改变基表数据的显示。
可以限制对数据的访问
可以使复杂的查询变的简单
提供了数据的独立性
提供了对相同数据的不同显示
②语法:
在CREATE VIEW语句后加入子查询.
CREATE [OR REPLACE] VIEW view
[(alias[, alias]...)]
AS subquery
[WITH READ ONLY]; --加了这一句之后,只能查询
例如:
create or replace view v_emp
(id,name,salary)
as
select employee_id,first_name||last_name,salary
from employees_bck;
注意:1.需要用视图权限,创建好之后,会生成像表一样的视图,但是只能查询和删除,不能修改和插入。
2.必须加上with read only,加上之后,只能查询。
3.创建视图需要验证表,列名是否正确
4.视图可以提交查询性能,因为视图相当于查询出来放在缓存中。
③删除视图
DROP VIEW view_name;
3.表空间