3.2序列(重点)
在很多数据库系统中都存在一个自动增长的列,如果要在Oracle中完成自动增长的
功能,则只能依靠序列完成,所有的自动增长操作,需要用户手工完成处理
序列的创建格式:
CREATE SEQUENCE sequence
[INCREMENT BY n][START WHIT n]
[{MAXVALUE n|NOMAXVALUE}]
[{MINVALUE n|NOMINVALUE}]
[{CYCLE|NOCYCLE}]
[{CACHE n|NOCACHE}]
我们先从基本的开始创建
范例:创建一个基本序列;
CREATE SEQUENCE myseq;序列已创建
序列创建完成之后,所有的自动增长应该由用户自己处理,所以在序列中提供了一下的操作;
nextVal:下一个值
currVAL:当前序列值
创建一个序列测试表
范例:
CREATE TABLE testseq(
next NUMBER,
curr NUMBER
);
添加数据,手工使用序列
INSERT INTO testseq(next,curr)VALUES(myseq.nextval,myseq.currval);
执行上述语句5次
然后观察
SELECT * FROM testseq;
从结果中发现,nextval的内容始终在进行自动增长的操作,而currval使用取出
当前操作的序列结果,也就是现在这种序列,每次的增幅是1.此时我们想
更改增幅 可以使用以下的一个参数
每次的增长幅度:[INCREMENT BY n]
范例:重新建立序列(不能使用CREATE OR REPLACE命名)
只能先删除重新创建序列
删除序列:DROP SEQUENCE myseq;
重新创建序列:CREATE SEQUENCE myseq INCREMENT BY 2;
重新创建testseq测试序列表
DROP TABLE testseq;
CREATE TABLE testseq(
next NUMBER,
curr NUMBER
);
重新执行数据的插入,插入5次
INSERT INTO testseq(next,curr)VALUES(myseq.nextval,myseq.currval);
然后查询
SELECT * FROM testseq;
从结果可以得知 现在的序列是以2为增幅增长
默认情况下,序列是从1开始的,那么可以使用[START WITH n]
重新创建序列,让他从10开始增幅
DROP SEQUENCE myseq;
CREATE SEQUENCE myseq INCREMENT BY 2 START WITH 10;
执行上面的测试表的操作
DROP TABLE testseq;
CREATE TABLE testseq(
next NUMBER,
curr NUMBER
);
INSERT INTO testseq(next,curr)VALUES(myseq.nextval,myseq.currval);
(同样的操作只要打/按回车即可)
然后再查询结果
SELECT * FROM testseq;
结果如我们期待的那样,默认的开始值1被替换成10了。
范例:下面重新创建一个序列,让其取值固定在1,3,5,7,9循环的序列号
DROP SEQUENCE myseq;
CREATE SEQUENCE myseq MAXVALUE 10 START WITH 1 INCREMENT BY 2
CACHE 2 CYCLE;
执行上面的测试表的操作
DROP TABLE testseq;
CREATE TABLE testseq(
next NUMBER,
curr NUMBER
);
INSERT INTO testseq(next,curr)VALUES(myseq.nextval,myseq.currval);
出入多次后观察结果,发现序列的内容现在是循环的操作,但是从实际来看
序列使用最多的语法,CREATE SEQUENCE 序列名称。
3.3同义词(了解只适合Oracle数据库)
之前一直存在这样的一种查询语句:
SELECT SYSDATE FROM DUAL;(查询系统信息)
之前一直强调DUAL是一张虚拟表,那么虽然是虚拟表,可是此表到底是
在哪里定义的呢?
如果现在使用system连接数据库,查询一下此表是否属于system
切换用户
CONN system/magager(安装完数据库时候设置的密码)
SELECT * FROM TAB WHERE TNAME='DUAL';
查询所有表查无dual;
我们在进入超级管理员sys用户中查询:
CONN sys/change_on_install AS SYSDBA;
SELECT * FROM TAB WHERE TNAME='DUAL';
在sys下存在此表
但是我在scott用户下能直接通过表名访问,正常情况下如果要访问不同用户
的表要使用“用户名.表名称”;
在sys用户下使用下列SQL语句
SELECT * FROM emp;
发生错误:表或则视图不存在
SELECT * FROM scott.emp;即可
可见DUAL实际上是通过同义词发挥了作用,同义词可以让其他用户通过一个
名称方便的访问“用户名.表名称”来访问其他用户下的表
CREATE SYNONYM 同义词名称 FOR 用户名.表名称;
范例:将scott用户下的emp表建立一个emp的同义词,然后在sys用户喜爱
通过同义词查询
CREATE SYNONYM emp FOR scott.emp;
SELECT * FROM emp;
可以完成查询
范例:删除emp的同义词
DROP SYNONYM emp;
Oracle之序列及同义词
最新推荐文章于 2021-06-11 14:47:43 发布