說明
今天看別人的代碼 ,遇見了 一條sql select ctg_fault_list_id_seq.nextval from dual 不懂意思,然后就研究了下
dual :是oracle 數據庫中的虛擬表,並不是真實存在的
XX_id_seq:這個是我們創建序列時自定義的一個序列名稱
ctg_fault_list_id_seq.nextval:這個是取出序列的下一個值,序列可以用戶id生成器,每次我們都通過序列取到不同的值,並且不會重復
序列基本用法
序列: 是oacle提供的用於產生一系列唯一數字的數據庫對象。
(1)自動提供唯一的數值
(2)共享對象
(3)主要用於提供主鍵值
(4)將序列值裝入內存可以提高訪問效率
創建序列
要有創建序列的權限
create sequence 或 create any sequence
創建序列的語法
CREATE SEQUENCE sequence //創建序列名稱 [INCREMENT BY n] //遞增的序列值是n 如果n是正數就遞增,如果是負數就遞減 默認是1 [START WITH n] //開始的值,遞增默認是minvalue 遞減是maxvalue [{MAXVALUE n | NOMAXVALUE}] //最大值 [{MINVALUE n | NOMINVALUE}] //最小值 [{CYCLE | NOCYCLE}] //循環/不循環 [{CACHE n | NOCACHE}];//分配並存入到內存中 NEXTVAL 返回序列中下一個有效的值,任何用戶都可以引用 CURRVAL 中存放序列的當前值 NEXTVAL 應在 CURRVAL 之前指定 ,二者應同時有效
示例
Create sequence seqEmp increment by 1 start with 1 maxvalue 3 minvalue 1 Cycle cache 2; //先nextval 后 currval Select seqEmp.nextval from dual; Select seqEmp.currval from dual; Cache<max-min/increment
解釋
{ Create 創建 Sequence 序列 seqEmop 序列名稱 Increment by 步長 Stat with 1 開始值 Maxvalue 最大值 Minvalue 最小值 Cycle 循環 nocycle 不循環 Cache 緩存 Cache<maxvalue-minvalue/increment by//一般不采用緩存 Nextvalue 下一個 Currval 當前值 }
實例應用
實現id的自動遞增
create table cdpt( id number(6), name varchar2(30), constraint pk_id primary key(id) ); Create sequence seq_cdpt Increment by 1 Start with 1 Maxvalue 999999 Minvalue 1 Nocycle nocache insert into cdpt values(seq_cdpt.nextval,’feffefe’); commit; select * from cdpt;
使用序列
會產生裂縫
l 序列在下列情況下出現裂縫:
• 回滾
• 系統異常
多個表同時使用同一序列
//修改序列的增量, 最大值, 最小值, 循環選項, 或是否裝入內存 alter SEQUENCE sequence //創建序列名稱 [INCREMENT BY n] //遞增的序列值是n 如果n是正數就遞增,如果是負數就遞減 默認是1 [START WITH n] //開始的值,遞增默認是minvalue 遞減是maxvalue [{MAXVALUE n | NOMAXVALUE}] //最大值 [{MINVALUE n | NOMINVALUE}] //最小值 [{CYCLE | NOCYCLE}] //循環/不循環 [{CACHE n | NOCACHE}];//分配並存入到內存中
修改序列的注意事項
l 必須是序列的擁有者或對序列有 ALTER 權限
l 只有將來的序列值會被改變
l 改變序列的初始值只能通過刪除序列之后重建序列的方法實現
刪除序列
l 使用DROP SEQUENCE 語句刪除序列
l 刪除之后,序列不能再次被引用
Alter sequence seqEmp maxvalue 5; Select seqEmp.nextval from dual;