三、序列裂縫
四、修改序列
五、刪除序列
在實際開發中,設計資料表的時候會把某些字段定義成乙個自動增長的、唯一的流水號,例如記錄編號、日誌編號等,mysql和sql server採用的是自增欄位,oracle和postgresql採用了更靈活的序列生成器。在本文中,把序列生成器簡稱為序列。
建立序列的語法如下:
create sequence 序列名
[minvalue n]
[maxvalue n]
[increment by n]
[start with n]
[cache n|nocache]
[order|noorder]
[cycle|nocycle]
;
引數說明:
oracle的序列分為遞增序列和遞減序列,遞減序列極少使用(二十年我從未用過),為了方便介紹,本文假設序列是遞增序列。
序列名
:序列名是標誌符,建議以seq_打頭,例如為t_operlog表的logid欄位建立乙個序列,可以把它命名為seq_operlog(或seq_operlog_logid),增加資料結構的可讀性,這是我的個人經驗,並不是oracle資料庫的要求。
[minvalue n]
:序列的最小值,預設值是1。
[maxvalue n]
:序列的最大值,預設值是9999999999999999999999999999。
[increment by n]
:序列遞增的步長,預設值是1。
[start with n]
:序列的起始值,預設值是minvalue,如果n小於minvalue,建立序列會報語法錯誤。
[cache n|nocache]
:是否採用快取機制,nocache不採用快取,預設cache 20,資料庫每次會生成20個值放在快取中,如果快取中有資料,就不需要再查資料庫了,採用快取機制可以提公升效率。
[order|noorder
]:獲取序列的時候是否按順序給值,如果多使用者一起獲取序列的值,使用order可以保證序列值的順序按訪問序列的事件排序,預設是noorder。
[cycle|nocycle]
:是否迴圈,預設不迴圈,如果不迴圈,序列值到了maxvalue後將不可用。
create sequence seq_girl;
執行以上sql語句會在資料庫中生成乙個名字為seq_girl的序列,除了序列名,其它的引數都採用預設值,相當於以下sql:
create sequence seq_girl
minvalue 1
maxvalue 9999999999999999999999999999
increment by 1
start with 1
cache 20
noorder
nocycle ;
序列建立後,用序列名.nextval
獲取序列的下乙個值,用序列名.currval
來檢視當前值。
在新的會話中,必須先使用nextval來產生乙個值後才可以使用currval進行檢視。
select seq_girl.nextval from dual;
-- 獲取序列seq_girl的下乙個值。
select seq_girl.currval from dual;
-- 獲取序列seq_girl的當前值
我們先建立乙個簡單的表。
create table t_girl
( name varchar2(10
),-- 姓名
keyid number(10
)-- 記錄編號
);
1)在insert語句中使用序列。
insert into t_girl
(name,keyid)
values
('西施'
,seq_girl.nextval)
;insert into t_girl
(name,keyid)
values
('妲已'
,seq_girl.nextval)
;insert into t_girl
(name,keyid)
values
('楊玉環'
,seq_girl.nextval)
;insert into t_girl
(name,keyid)
values
('李師師'
,seq_girl.nextval)
;
執行結果:
2)在update語句中使用序列。
update t_girl set keyid=seq_girl.nextval+
100;
執行結果:
序列的nextval方法不會產生事務,事務回滾命令rollback不會恢復序列的值,我們來做乙個測試。
1)先獲取序列的當前值。
2)執行一條不會成功的sql語句。
3)再獲取序列的當前值。
如果用序列的值作為表中某個欄位的值,這個欄位的值可能會出現不連續的情況。因為序列的值不連續,有裂縫。
序列在下列情況下出現裂縫:
1)執行sql語句失敗;
2)事務回滾;
3)序列快取;
4)多個表同時使用同一序列;
5)其它異常。
修改序列的語法如下:
alter sequence 序列名
[minvalue n]
[maxvalue n]
[increment by n]
[start with n]
[cache n|nocache]
[order|noorder]
[cycle|nocycle]
;
修改序列的引數與建立序列的引數相同,不同的是,修改序列時沒有預設值。
alter sequence seq_girl increment by 10 cycle
刪除序列的語法如下:
drop sequence 序列名;
Oracle序列生成器
三 序列裂縫 四 修改序列 五 刪除序列 在實際開發中,設計資料表的時候會把某些字段定義成乙個自動增長的 唯一的流水號,例如記錄編號 日誌編號等,mysql和sql server採用的是自增欄位,oracle和postgresql採用了更靈活的序列生成器。在本文中,把序列生成器簡稱為序列。建立序列的...
Oracle序列生成器
三 序列裂縫 四 修改序列 五 刪除序列 在實際開發中,設計資料表的時候會把某些字段定義成乙個自動增長的 唯一的流水號,例如記錄編號 日誌編號等,mysql和sql server採用的是自增欄位,oracle和postgresql採用了更靈活的序列生成器。在本文中,把序列生成器簡稱為序列。建立序列的...
序列號生成器
生成序列號,最大值為max val。如果達到max val,從0開始。public class serialgenerator return serialno 求整數有幾位,如234是3位。param i return private static final int getrnum int i i...