mysql建立序列發生器 Oracle序列生成器

2021-10-18 21:14:08 字數 3203 閱讀 1923

在實際開發中,設計資料表的時候會把某些字段定義成乙個自動增長的、唯一的流水號,例如記錄編號、日誌編號等,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後將不可用。

二、序列的使用

1、建立最簡單的序列

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 ;

2、在dual虛表使用序列

序列建立後,用序列名.nextval獲取序列的下乙個值,用序列名.currval來檢視當前值。

在新的會話中,必須先使用nextval來產生乙個值後才可以使用currval進行檢視。

select seq_girl.nextval from dual; -- 獲取序列seq_girl的下乙個值。

select seq_girl.currval from dual; -- 獲取序列seq_girl的當前值

3、在sql語句中使用序列

我們先建立乙個簡單的表。

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;

執行結果:

三、序列裂縫

1、序列不產生事務

序列的nextval方法不會產生事務,事務回滾命令rollback不會恢復序列的值,我們來做乙個測試。

1)先獲取序列的當前值。

2)執行一條不會成功的sql語句。

3)再獲取序列的當前值。

2、序列裂縫

如果用序列的值作為表中某個欄位的值,這個欄位的值可能會出現不連續的情況。因為序列的值不連續,有裂縫。

序列在下列情況下出現裂縫:

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 序列名;

音訊訊號發生器 發生器電路

以下三種電路比較簡單,很好理解!用的晶元不一樣,也可以設計出同種型別的電路。前面用閘電路實驗組成多諧報蕩器,它可以驅動發光二極體發出變化無窮的彩色閃光,用多諧振盪器輸出的脈衝驅動可以使揚聲器發出聲響,用一種頻率的訊號源可以使揚聲器發出單一頻率的聲響 如果用幾種頻率的訊號源混合後可以發出各種不同的聲響...

密碼發生器

在對銀行賬戶等重要許可權設定密碼的時候,我們常常遇到這樣的煩惱 如果為了好記用生日吧,容易被破解,不安全 如果設定不好記的密碼,又擔心自己也會忘記 如果寫在紙上,擔心紙張被別人發現或弄丟了.這個程式的任務就是把一串拼音字母轉換為6位數字 密碼 我們可以使用任何好記的拼音串 比如名字,王喜明,就寫 w...

常數發生器

經常使用的常數可以用常數發生器產生,而不必占用乙個16位字。所用常數的數值由定址位as來定義,硬體完全自動地產生數字 1 0 1 2 4 8,如下 常 數 發 生 器 c g 1 和 c g 2 的 值 暫存器 as 常數 說明 r2 00 暫存器模式 r2 01 0 絕對定址模式 r2 10 00...