oracle序列


一、序列
  序列是oracle用來生產一組等間隔的數值。序列是遞增,而且連續的。oracle主鍵沒有自增類型,所以一般使用序列產生的值作為某張表的主鍵,實現主鍵自增。序列的編號不是在插入記錄的時候自動生成的,必須調用序列的方法來生成(一般調用nextval方法)。我們也可以編寫表的insert觸發器來進自動生成。
  創建語法:

create sequence 序列名稱
[start with 初始量]
[increment by 遞增量]
[maxvalue 最大值| nomaxvalue]
[minvalue 最小值| nominvalue]
[cycle | nocycle]
[cache 緩存個數| nocache];

start with:生成第一個序列號,對於升序列,其默認值為序列最小值;對於降序序列,其默認值為序列的最大值 。
increment by:用於指定序列號之間的間隔,其默認值為1,如果integer為正值,則生成的序列按升序排列,如果integer為負值,則生成的序列將按降序排列。
maxvalue:序列可以生成的最大值。
nomaxvalue:oracle將升序序列的最大值設為1027,將降序序列的最大值設為-1.這是默認選項。
minvalue:minvalue必須小於或等於start with的值,並且必須小於maxvalue的值。
nominvalue:oracle將升序的最小值設為1,或將降序序列的最小值設為-1026.這是默認值。
cycle:序列在達到最大值或最小值后,將繼續從頭開始生成值。
nocycle:序列在達到最大值或最小值后,將不能再繼續生成值。不寫默認為nocycle這是默認選項 。
cache:預先分配一組序列號,並將其保留在內存中,這樣可以更快地訪問序列號.當用完緩存中的所有序列號.oracle將生成另一組數值,並將其保留在緩存中。
nocache:不會加快訪問速度而預先分配序列號,如果在創建序列時忽略了cache和nocache,orcale將默認緩存20個序列號。

修改語法:
alter sequence 序列名稱
[start with 初始量]
[increment by 遞增量]
[maxvalue 最大值| nomaxvalue]
[minvalue 最小值| nominvalue]
[cycle | nocycle]
[cache 緩存個數| nocache];

二、例子

   以下代碼person表如下:

DROP TABLE person ;
CREATE TABLE person (
id NUMBER(11) NOT NULL ,
username VARCHAR2(255 ) NULL ,
age NUMBER(11) NULL ,
password VARCHAR2(255) NULL ,
PRIMARY KEY (id)
)

  創建序列

create sequence seq_tb_person
minvalue 1
maxvalue 999999999999999999999999999
start with 1
increment by 1
cache 20;

  使用序列

insert into person (id, username, age, password) values (seq_tb_person.nextval, '張三', 20, 'zhang123')

  我們也可以通過建立觸發器,當有數據插入表person時,使用oracle序列為其去的遞增的主鍵值

-- 創建觸發器
create or replace trigger trigger_set_person_id before insert on person
for each row
begin
    select seq_tb_person.nextval into :new.id from dual;
end;
-- 插入數據
insert into person ( username, age, password) values ('張三', 20, 'zhang123')

 

  修改序列

alter sequence seq_tb_person
minvalue 1
maxvalue 999999999999999999999999999
-- start with 49 對於已經啟動的序列,無法設置初始值
increment by 1
cache 20;

  查看用戶的序列:

select sequence_name, min_value, max_value, increment_by, last_number from user_sequences;

  刪除序列

drop sequence 序列名;

  通過USER_OBJECTS可以查看用戶擁有的序列,USER_SEQUENCES可以查看序列的設置。

三、注意點

  • 一個序列可以被多張別使用,不過一般建議為每個表建立單獨的序列。
  • 當使用到序列的事務發生回滾。會造成序列號不連續。在用生成的序列值作為編號做插入數據庫操作時,可能遇到事務提交失敗,從而導致序號不連續。
  • 大量語句發生請求,申請序列時,為了避免序列在運用層實現序列而引起的性能瓶頸。Oracle序列允許將序列提前生成 n個先存入內存,在發生大量申請序列語句時,可直接到運行最快的內存中去得到序列。但cache個數最好不要設置過大,因為在數據庫重啟時,會清空內存信息,預存在內存中的序列會丟失,當數據庫再次啟動后,序列從上次內存中最大的序列號+1 開始存入n個。這種情況也能會在數據庫關閉時也會導致序號不連續。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM