欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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')


相关标签: oracle