oracle序列号、

版权声明:本文为博主原创文章,未经博主允许不得转载。 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)); 

序列号的特点

  1. 可以由多个用户共享的数据库对象.
  2. 序列号生产机器,专为表中的数据自动产生序列号.
  3. 由oracle内部例程产生和维护.
  4. 独立于使用它的表.
  5. 通常是用来产生主键
  6. 可以取代生产序列号的应用程序.
  7. 如果让它常驻内存,可以提高访问序列号的效率.

创建序列号的语法


CREATE SEQUENCE 序列号名字 
[START WITH n] [INCREMENT BY n] 
[{MAXVALUE n | NOMAXVALUE}] 
[{MINVALUE n | NOMINVALUE}]
[{CACHE n | NOCACHE}]
[{CYCLE n | NOCYCLE | CYCLE 20}];

其中:
  1. 序列号的名字::序列号产生器的名字, 也即是该序列的名字
  2. START WITH n:定义了所产生的第一个序列号码,这里 n 为整数。如果该字句省略,那么序列就从1开始
  3. INCREMENT BY n : 定义了序列号增加的步长(序列号之间的间隔,当前序列号与下一个序列号之间的差),如果该字句省略,序列号增加步长为1.
  4. MAXVALUE n :定义了该序列号可产生的序列号的最大值
  5. NOMAXVALUE : 说明升序的序列号的最大值为 10的27次方。而降序的序列号的最大值为 -1 (这也是默认值)。
  6. MINVALUE :定义了可产生序列号的最小值。
  7. NOMINVALUE : 说明升序序列号的最小值为1,而降序的序列号的最小值为负10的26次方(这也是默认值)。
  8. CACHE n :说明将有n个序列号码被oracle 服务器预分配和保存在内存中。
  9. NOCACHE:说明没有序列号被oracle服务器预分配和保存在内存当中。
  10. CACHE20:这是默认值。不需要说明。
  11. CYCLE n:说明在序列号达到最大或最小值后,将继续产生序列号。
  12. 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;

如果想查看当前序列号的值,与序列号下一次的值,可以利用SELECT 语句 加2个位列来查询。NEXTVAL 以及 CURRVAL
  1. NEXTVAL:返回序列号下一次可获得的值
  2. 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 做的操作包括
  1. 第一次引用这个序列时,oracle计算出 n 个序列号码,并将它们放入内存当中。
  2. 每一个要求下一个序列号码的请求,都将从内存中的序列号码中得到。
  3. 当内存中的最后一个序列号码用完之后,假如又收到下一个获取序列号请求时,oracle服务器再次计算出 n 个序列号并将它们放入内存当中。
当我们在使用序列的时候,比如插入,更新当中使用了序列,那么不管插入、更新是否成功,只要使用了序列,那么当前序列的值就会消失,再次使用时就会是下一个序列的值。有3点,当使用序列号的事物被回滚,另外的表使用序列时,系统奔溃时,序列会丢失。

NEXTVAL 和 CURRVAL伪列的使用规则。

使用规则

  1. 序列必须先定义才能使用 NEXTVAL,CURRVAL。
  2. 使用伪列 NEXTVAL 时会产生下一个新的序列号码,并将该序列号码放入 CURRVAL 伪列当中。
  3. 使用伪列 CURRVAL 可以获取当前序列的系列号码,使用之前必须在当前会话当中使用过 NEXTVAL 伪列产生过一个序列值。

使用场景

可使用场景
  1. 查询语句的 SELECT 子句中,但不包括子查询的 SELECT 子句。
  2. 在 UPDATE 语句的 SET 子句当中。
  3. 在 INSERT 语句中的子查询的 SELECT 列表中。
  4. 在 INSERT 语句的 VALUES 子句中。
不能使用的场景
  1. 视图的 SELECT 子句中,
  2. 在 SELECT 语句的子查询中。
  3. 在 UPDATE 语句的子查询当中。
  4. 在 DELETE 语句的子查询中。
  5. 在包含 DISTINCT 关键字的查询 SELECT 语句中。
  6. 在包含 ORDER BY 子句的查询 SELECT 语句中。
  7. 在包含 GROUP BY 子句的查询 SELECT 语句中。
  8. 在包含 HAVING 子句的查询 SELECT 语句中。
  9. 在包含 DEFAULT 表达式的 CREATE TABLE 语句中。
  10. 在包含 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 同义词名称


猜你喜欢

转载自blog.csdn.net/belovehejian/article/details/77411409