ORACLE 序列,索引,同义词
程序员文章站
2022-06-02 13:09:24
...
-- 序列
/**
序列:可供多个用户来产生唯一数值的数据库对象
1. 自动提供唯一的数值
2. 共享对象
3. 主要用于提供主键值
3. 将序列值装入内存中可以提高访问效率
*/
-- 创建序列
create sequence empseq
increment by 10 --每次自增10
start with 10 -- 从10开始增长
maxvalue 100 -- 最大值
cycle -- 需要循环
nocache -- 不需要缓存登陆
-- 查询序列 nextval下一个值 ,currval当前值。第一次使用必须先调用nextval
SELECT empseq.nextval from dual;
SELECT empseq.currval from dual;
-- 创建一个空表
CREATE TABLE emp01
AS
SELECT EMPLOYEE_ID,LAST_NAME,SALARY
FROM EMPLOYEES
WHERE 1 = 2
SELECT * FROM emp01;
-- 插入值
INSERT INTO emp01 VALUES(1,'aa',1000)
-- 这里可以使用序列来代替主键值
INSERT INTO emp01 VALUES(empseq.nextval,'cc',3000)
--修改序列
ALTER sequence empseq
INCREMENT by 1 --每次增值1
nocycle --不循环
INSERT INTO emp01 VALUES(empseq.nextval,'dd',4000)
--修改序列初始值必须删除序列之后重建序列的方法实现
-- 注意事项
/**
1. 将序列值装入内存可提高访问效率
序列在以下情况出现裂缝
1. 回滚
2. 系统异常
3. 多个表同时使用同一序列
2. 如果不将序列值装入内存nocache,可使用表 user_sequences 查看序列当前的有效值
*/
-- 裂缝原因分析
/*
多表使用同一序列:
a表 插入一条数据 主键使用 a1seq序列
b表 插入一条数据 主键实现 a1seq序列
此时产生问题
a表使序列值为1了
b表使序列值为2了
a表再次插入值序列值就为3了
回滚情况:回滚不能使序列回滚
*/
-- 查看序列
SELECT * FROM user_sequences;
-- 删除序列
drop sequence empseq
-- 索引
/**
1. 索引被删除或损坏,不会对表产生影响,其影响的只是查询速度
2. 索引一旦建立,Oracle自动维护,用户不需要管Oracle怎么使用索引
3. 在删除一个表得同时,所有基于该表得索引会自动被删除
4. 通过指针加速Oracle 服务器的查询速度
5. 通过快速定位数据的方法,减少磁盘I/O
*/
-- 创建索引
/*
1. 自动创建:在定义PRIMARY KEY 或unique约束之后 系统字体正在相应的列上创建唯一性索引
2. 手动创建:用户可以在其他列上创建非唯一的索引,以加速查询
create index index_name
on
table_name(column1,column2....)
*/
--创建一个索引
CREATE INDEX emp01_id_ix
on emp01(EMPLOYEE_ID)
-- 删除一个索引
drop index emp01_id_ix ;
-- 什么时候创建索引
1. 列中数据值分布范围很广 0~1亿
2. 列经常在WHERE子局或者连接条件中出现
3. 表经常被访问而且数据量很大,访问的数据大概占数据总量的2% ~ 4% 数据量过大的话不行,访问会变慢
-- 什么时候不要创建索引
1. 表很小
2. 列不经常作为连接条件或出现在where子句中
3. 查询的数据大于2% ~ 4%
4. 表经常更新
-- 同义词 synonym
1. 方便访问其他用户对象
2. 缩短对象名称的长度
-- 创建同义词
CREATE SYNONYM e for EMPLOYEES;
SELECT * FROM e;
-- 练习
-- 1. 创建序列dept_id_seq,开始值为200,每次增长10,最大值为10000
CREATE sequence dept_id_seq
start with 200
maxvalue 10000
INCREMENT by 10
SELECT dept_id_seq.nextval from dual;
SELECT dept_id_seq.currval from dual;
-- 2. 使用序列向表dept中插入数据
create table dept01 as
select department_id id,department_name name
from departments
where 1=2
SELECT * FROM dept01;
INSERT INTO DEPT01 VALUES(dept_id_seq.nextval,'dddd')
上一篇: 数据库对象——序列,存储过程