在创建数据库表时,大多数数据库系统规划建议是使用一个无意义的、可自增长的字段作为主键的值。
一、序列简介
ORACLE的序列是一种数据库对象,主要用来为表产生唯一值。
我们可以通过数据字典找到序列对象,因此可以被多个对象共享。
我们主要使用序列来创建一个主键的值,它对于每一行必须是唯一的。
二、创建数据序列
-
create sequence invoice_seq
-
increment by 1
-
start with 1
-
maxvalue 99999
-
nocycle nocache
-
;
INCREMENT BY:用于定义序列的步长,如果省略则默认为1,如果负值,则代表序列的值是按照此步长递减的。
START WITH:定义序列的初始值,默认为1.
MAXVALUE:定义序列生成器能产生的最大值
CYCLE和NOCYCLE:表示当序列生成器的值达到限制值后是否循环。CYCLE代表循环,NOCYCLE代表不循环。
CACHE:定义存放序列的内存块的大小,默认为20.NOCACHE表示不对序列进行内存缓冲。
注意:序列如果用来产生主键,不建议使用CYCLE选项。
我们可以通过user_objects和user_sequences查看序列的相关信息。
-
SQL> select object_id,object_name,object_type from user_objects where object_name=upper('invoice_seq');
-
-
OBJECT_ID OBJECT_NAME OBJECT_TYPE
-
---------- -------------------------------------------------------------------------------- -------------------
-
74775 INVOICE_SEQ SEQUENCE
-
SQL> select sequence_name,min_value,max_value,increment_by,last_number from user_sequences;
-
-
SEQUENCE_NAME MIN_VALUE MAX_VALUE INCREMENT_BY LAST_NUMBER
-
------------------------------ ---------- ---------- ------------ -----------
-
INVOICE_SEQ 1 99999 1 1
三、NEXTVAL和CURRVAL伪列
NEXTVAL:返回下一个可用的序列值。
CURRVAL:获得当前的序列值。
当使用sequence.NEXTVAL时,一个新的序列数被产生并且当前的序列数被放入CURRVAL,而CURRVAL伪列用于查询用户刚才产生的序列数。
-
SQL> select sequence_name,min_value,max_value,increment_by,last_number from user_sequences;
-
-
SEQUENCE_NAME MIN_VALUE MAX_VALUE INCREMENT_BY LAST_NUMBER
-
------------------------------ ---------- ---------- ------------ -----------
-
INVOICE_SEQ 1 99999 1 1
-
SQL> select invoice_seq.NEXTVAL from dual;
-
-
NEXTVAL
-
----------
-
1
-
SQL> select invoice_seq.CURRVAL from dual;
-
-
CURRVAL
-
----------
-
1
四、使用数据序列
-
SQL> create table invoice
-
2 (
-
3 invoice_id NUMBER PRIMARY KEY,
-
4 vendor_id NUMBER NOT NULL,
-
5 invoice_number VARCHAR2(50) NOT NULL,
-
6 invoice_date DATE DEFAULT SYSDATE,
-
7 invoice_total NUMBER(9,2) NOT NULL,
-
8 payment_total NUMBER(9,2) DEFAULT 0
-
9 )
-
10 ;
-
-
Table created
-
SQL> insert into invoice
-
2 (invoice_id,vendor_id,invoice_number,invoice_total)
-
3 values(invoice_seq.NEXTVAL,10,'INV'||invoice_seq.currval,100)
-
SQL> select invoice_id,vendor_id,invoice_number,invoice_total from invoice;
-
-
INVOICE_ID VENDOR_ID INVOICE_NUMBER INVOICE_TOTAL
-
---------- ---------- -------------------------------------------------- -------------
-
4 10 INV4 100.00
五、修改序列
我们有时候需要修改序列,比如重新制定cycle、cache、maxvalue、minvalue、increment by。
-
ALTER SEQUENCE sequence
-
[INCREMENT BY n]
-
[{MAXVALUE n|NOMAXVALUE}]
-
[{MINVALUE n|NOMINVALUE}]
-
[{CYCLE|NOCYCLE}]
-
[{CACHE n|NOCACHE}];
注意:
1.不能修改序列的起始值,如果想以不同的数字重新开始一个序列,必须删除序列重建。
2.序列的最小值不能大于序列的当前值。
3.序列的最大值不能小于序列的当前值。
4.修改后的序列规则不影响以前的序列值,只有未来的序列值会受到影响。
5.用户必须具有ALTER SEQUENCE的权限。
-
SQL> select invoice_id,vendor_id,invoice_number,invoice_total from invoice;
-
-
INVOICE_ID VENDOR_ID INVOICE_NUMBER INVOICE_TOTAL
-
---------- ---------- -------------------------------------------------- -------------
-
4 10 INV4 100.00
六、删除序列
-
drop sequence invoice_seq;
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/31355629/viewspace-2141267/
,如需转载,请注明出处,否则将追究法律责任。