版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/belovehejian/article/details/77411409
创建即将使用的表
create table supplier
(s_codde number(6),
sname varchar2(25),
contact varchar2(15),
phone varchar2(15),
fax varchar2(15));
序列号的特点
- 可以由多个用户共享的数据库对象.
- 序列号生产机器,专为表中的数据自动产生序列号.
- 由oracle内部例程产生和维护.
- 独立于使用它的表.
- 通常是用来产生主键
- 可以取代生产序列号的应用程序.
- 如果让它常驻内存,可以提高访问序列号的效率.
创建序列号的语法
CREATE SEQUENCE 序列号名字
[START WITH n] [INCREMENT BY n]
[{MAXVALUE n | NOMAXVALUE}]
[{MINVALUE n | NOMINVALUE}]
[{CACHE n | NOCACHE}]
[{CYCLE n | NOCYCLE | CYCLE 20}];
其中:
- 序列号的名字::序列号产生器的名字, 也即是该序列的名字
- START WITH n:定义了所产生的第一个序列号码,这里 n 为整数。如果该字句省略,那么序列就从1开始
- INCREMENT BY n : 定义了序列号增加的步长(序列号之间的间隔,当前序列号与下一个序列号之间的差),如果该字句省略,序列号增加步长为1.
- MAXVALUE n :定义了该序列号可产生的序列号的最大值
- NOMAXVALUE : 说明升序的序列号的最大值为 10的27次方。而降序的序列号的最大值为 -1 (这也是默认值)。
- MINVALUE :定义了可产生序列号的最小值。
- NOMINVALUE : 说明升序序列号的最小值为1,而降序的序列号的最小值为负10的26次方(这也是默认值)。
- CACHE n :说明将有n个序列号码被oracle 服务器预分配和保存在内存中。
- NOCACHE:说明没有序列号被oracle服务器预分配和保存在内存当中。
- CACHE20:这是默认值。不需要说明。
- CYCLE n:说明在序列号达到最大或最小值后,将继续产生序列号。
- NOCYCLE:说明在序列号达到最大或最小值之后,将不再产生序列号(这也是默认值)。
该语句也是 DDL 语句。DDL语句是用于定义或管理数据库对象的语句。
使用
创建序列号
create sequence supplier_s_code
start with 2000
INCREMENT by 10
maxvalue 100000
nocache
nocycle;
该语句意思为:从2000开始,步长为 10 最大值为 100000, 没有预分配,最大值之后不在产生序列号
查看序列号信息
SELECT * FROM user_sequences;
- NEXTVAL:返回序列号下一次可获得的值
- CURRVAL:返回序列号当前的值
使用 CURRVAL时需要注意,在使用之前,必须在当前会话(账号下)使用过 NEXTVAL产生一个序列号的值,或者曾经使用过该序列号产生过值。否则会出现错误。
使用序列号插入数据
INSERT INTO supplier
(s_codde, sname, contact, phone, fax)
VALUES
(supplier_s_code.nextval, '仙客来百货','张根发', 4444944, 4444844);
提示插入成功,那么现在可以使用 CURRVAL 来获取序列当前的值了。
SELECT supplier_s_code.currval FROM dual
建立新的序列。
CREATE SEQUENCE ord_ordno START WITH 1 INCREMENT BY 1 MAXVALUE 10000 NOCYCLE
通过查询序列或发现,该序列号与上一个序列号之间有不同之处,
上一个序列号因为使用了 NOCACHE 所以oracle为分配缓存任何序列号值,而这次建立的序列号在建立的时候为使用 NOCACHE 所以oracle默认缓存了20个序列值。
orcle建议,在建立序列的时候尽量少了 NOCYCLE 。
利用 CREATE SEQUENCE 语句的 CACHE n 子句来说明让oracle计算出 n 个序列号码,并将它们放入内存当中,在一定程度上能加快访问的速度。但是假如这个序列为共享的序列(多个用户在使用)的话,那么有可能某一个用户获得的序列号码是有间隔的,并不是连贯性的。
使用该子句的话 oracle 做的操作包括
- 第一次引用这个序列时,oracle计算出 n 个序列号码,并将它们放入内存当中。
- 每一个要求下一个序列号码的请求,都将从内存中的序列号码中得到。
- 当内存中的最后一个序列号码用完之后,假如又收到下一个获取序列号请求时,oracle服务器再次计算出 n 个序列号并将它们放入内存当中。
当我们在使用序列的时候,比如插入,更新当中使用了序列,那么不管插入、更新是否成功,只要使用了序列,那么当前序列的值就会消失,再次使用时就会是下一个序列的值。有3点,当使用序列号的事物被回滚,另外的表使用序列时,系统奔溃时,序列会丢失。
NEXTVAL 和 CURRVAL伪列的使用规则。
使用规则
- 序列必须先定义才能使用 NEXTVAL,CURRVAL。
- 使用伪列 NEXTVAL 时会产生下一个新的序列号码,并将该序列号码放入 CURRVAL 伪列当中。
- 使用伪列 CURRVAL 可以获取当前序列的系列号码,使用之前必须在当前会话当中使用过 NEXTVAL 伪列产生过一个序列值。
使用场景
可使用场景
- 查询语句的 SELECT 子句中,但不包括子查询的 SELECT 子句。
- 在 UPDATE 语句的 SET 子句当中。
- 在 INSERT 语句中的子查询的 SELECT 列表中。
- 在 INSERT 语句的 VALUES 子句中。
不能使用的场景
- 视图的 SELECT 子句中,
- 在 SELECT 语句的子查询中。
- 在 UPDATE 语句的子查询当中。
- 在 DELETE 语句的子查询中。
- 在包含 DISTINCT 关键字的查询 SELECT 语句中。
- 在包含 ORDER BY 子句的查询 SELECT 语句中。
- 在包含 GROUP BY 子句的查询 SELECT 语句中。
- 在包含 HAVING 子句的查询 SELECT 语句中。
- 在包含 DEFAULT 表达式的 CREATE TABLE 语句中。
- 在包含 DEFAULT 表达式的 ALTER TABLE 语句中。
序列的修改
修改序列号的语法跟创建序列的语法差不多,只不过 CREATE SEQUENCE 要变成 ALTER SEQUENCE,并且去掉了 START WITH 子句。
修改序列要注意几点:
- 必须要有 ALTER ANY SEQUENCE 系统权限。
- 不能修改 START WITH 选项,如果一定要修改,只能删掉序列,重新创建。
- ALTER SEQUENCE 只能影响以后的序列号码。
- 修改后的 MAXVALUE 不能小于序列号当前的值。比如当县序列号的值为 1000 ,那么久不能修改 MAXVALUE 的值为 999。
删除序列号
语法:
DROP SEQUENCE 序列号名
同义词
在世纪工作中,我们经常会碰到一些表名称很长的表,这个时候如果需要对该表进行查询的话,那么每一次查询都需要输入一次这个很长的表名,这无疑会使人感到很郁闷,那么oracle的同义词就能帮我们解决这个问题。
比如我们查询一个表,表名比较长
SELECT * FROM supplier
SELECT * FROM s
创建同义词
语法:
CREATE [PUBLIC] SYNONYM 同义词名字 FOR 对象名
- PUBLIC:使用了该字段的话,那么表明所有用户都可以访问这个同义词
- 对象名:创建的同义词基于的对象名。比如我们要为 supplier 表创建同义词,那么对象名就是该表名。
创建同义词需要注意的是,所基于的对象下个不能包含在任何软件包中。而且一个私有的同义词不能与当前用户下的任何同义词重名。而且必须要有创建同义词的
可以通过 user_synonym 表来查询相关的同义词信息。
创建同义词
CREATE SYNONYM s FOR supplier;
CREATE SYNONYM s FOR supplier;
通过同义词来查询真是的表数据
SELECT * FROM s
可以看到 通过同义词,我们查询到了真是的 supplier 表中的数据。
因为没有使用 PUBLIC 字段,所以切换到别的用户的时候,我们无法使用该同义词。但是可以使用另外的方法来使用,比如该同义词属于 SCOTT 用户,那么在别的用户下面我们可以使用 SCOTT.s 来使用该同义词。
oracle没有提供修改同义词的方法,如果想要修改 ,只能删除之后重新建立同义词。
删除同义词
DROP SYNONYM 同义词名称