在很多数据库系统中都存在一个自动增长的列,如果现在要想在Oracle中完成自动增长的功能,则只能依靠序列完成,所有的自动增长操作,需要用户手工完成处理。
序列的创建格式:
|
CREATE SEQUENCE sequence [INCREMENT BY n][START WITH n] [{MAXVALUE n | NOMAXVALUE}] [{MINVALUE n | NOMINVALUE}] [{CYCLE|NOCYCLE}] [{CACHE n|NOCACHE}]; |
范例:创建一个myseq的序列,验证自动增长的操作。
|
CREATE SEQUENCE myseq; |
序列创建完成之后,所有的自动增长应该由用户自己处理,所以在序列中提供了以下的两种操作:
·nextVal:取得序列的下一个内容
·currVal:取得序列的当前内容
范例:建立一张表以验证序列的操作
|
CREATE TABLE testseq( next NUMBER, curr NUMBER ); |

下面向表中添加数据,添加数据的时候需要手工使用序列
范例:使用序列
|
INSERT INTO testseq(next,curr) VALUES(myseq.nextval,myseq.currval); |
将以上的语句执行5次。
范例:查询testseq表,观察序列的变化
|
SELECT * FROM testseq; |

从结果中发现,nextval的内容始终在进行自动增长的操作,而curr使用取出当前操作的序列结果。也就是说,现在的这种序列,每次增长的幅度是1,那么也可以修改序列的增长幅度。
可以使用以下的一个参数:
·每次的增长幅度:INCREMENT BY 长度
范例:重新建立序列
|
删除序列: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); |

从序列的结果来看,每次取的都是奇数。
默认情况下,序列从1开始的,那么可以使用START WITH指定其开始的位置。
|
DROP SEQUENCE myseq; CREATE SEQUENCE myseq INCREMENT BY 2 START WITH 10; |
序列的开始位置是10,以后直接从10开始进行序列的计算。

下面重新创建一个序列,让其取值固定在1、3、5、7、9,循环序列。
|
DROP SEQUENCE myseq; CREATE SEQUENCE myseq MAXVALUE 10 INCREMENT BY 2 START WITH 1 CACHE 2 CYCLE; |

重新建立testseq表,插入数据,以测试最终的结果,可以发现序列的内容现在是循环的操作。
但是从实际来看,序列使用最多的语法:CREATE SEQUENCE 序列名称。
之前一直存在这样的一种查询语句:
|
SELECT SYSDATE FROM dual; |

之前一直强调,dual是一张虚拟表,那么虽然是虚拟表,可是此表到底是在哪里定义的?
如果现在使用system连接数据库,查询一下此张表是否属于system用户。
|
CONN system/manager; |
通过此用户没有查找到dual表,那么sys用户呢?
|
CONN sys/xujing AS SYSDBA; |

在sys用户下存在此表。此表在sys下,但是在scott用户下却可以直接通过表名称访问,那么正常情况下如果要访问不同用户的表需要使用“用户名.表名称”。
那么此时,实际上就是同义词的作用。同义词,可以让其他用户通过一个名称方便的访问“用户名.表名称”。
创建同义词的语法:
|
CREATE SYNONYM 同义词名称 FOR 用户名.表名称; |
范例:将scott.emp定义emp的同义词
|
CREATE SYNONYM emp FOR scott.emp; |

如果要删除一个同义词,可以使用如下的语法:
|
DROP SYNONYM 同义词名称; |
范例:删除emp的同义词
|
DROP SYNONYM emp; |
但是,此种特性只适合于Oracle数据库。
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/21817401/viewspace-620800/ ,如需转载,请注明出处,否则将追究法律责任。