Mysql儲存過程(五) SEQUENCE的實現

2021-09-02 09:14:00 字數 3123 閱讀 9778

在 oracle 中, sequence 提供多表多字段可共用乙個不重複值。 mysql 中存在自增列,基本可以滿足 pk 的要求。但自增列存在限制:

a. 只能用於表中的乙個字段,一張不能同時存在兩個以上的自增列 ;

b. 自增列必須被定義為 key ( pk 或 fk ) ;

c. 自增列不能被多個表共用 ;

d. 當 insert 語句不包括自增字段或將其值設定為 null 時,該值會自動填上。

在不要求字段順序遞增的情況下,可以在 mysql 中實現序列:

sql code 5-1:

drop table if exists sequence;    

-- 建sequence表,指定seq列為無符號大整型,可支援無符號值:0(default)到18446744073709551615(0到2^64–1)。

create table sequence (

name varchar(50) not null,

current_value bigint unsigned not null default 0,

increment int not null default 1,

primary key (name) -- 不允許重複seq的存在。

) engine=innodb;

delimiter /

drop function if exists currval /

create function currval(seq_name varchar(50))

returns bigint

begin

declare value bigint;

select current_value into value

from sequence

where upper(name) = upper(seq_name); -- 大小寫不區分.

return value;

end;

/ delimiter ;

delimiter /

drop function if exists nextval /

create function nextval (seq_name varchar(50))

returns bigint

begin

declare value bigint;

update sequence

set current_value = current_value + increment

where upper(name) = upper(seq_name);

return currval(seq_name);

end;

/ delimiter ;

delimiter /

drop function if exists setval /

create function setval (seq_name varchar(50), value bigint)

returns bigint

begin

update sequence

set current_value = value

where upper(name) = upper(seq_name);

return currval(seq_name);

end;

/ delimiter ;

在 sql 中使用序列:

sql code 5-2:

[c-sharp] view plaincopy

建立序列,往sequence表插入值即可:

mysql> insert into sequence set name='myseq';

檢視當前已建序列:

mysql> select * from sequence;

+-------+---------------+-----------+

| name | current_value | increment |

+-------+---------------+-----------+

| myseq | 0 | 1 |

+-------+---------------+-----------+

1 row in set (0.00 sec)

獲得序列的下乙個值,第一次使用,因此值為1:

mysql> select nextval('myseq');

+------------------+

| nextval('myseq') |

+------------------+

| 1 |

+------------------+

1 row in set (0.00 sec)

在儲存過程中使用序列(以 sql code 1-1 中建立的 testproc 表為例),此儲存過程返回插入後的 id ,如果插入失敗,則返回 -1 :

sql code 5-3:

[c-sharp] view plaincopy

create procedure test_sequence(in i_name varchar(100),

out o_ret bigint)

begin

declare exit handler for sqlwarning,not found,sqlexception set o_ret = -1;

set o_ret = nextval('myseq');

insert into testproc values (o_ret,i_name);

insert into testproc3 values (o_ret,i_name);

end;

mysql 五 儲存過程

5.1什麼是儲存過程 帶有邏輯的sql語句 之前的sql沒有條件判斷,沒有迴圈 儲存過程帶上流程控制語句 if while 5.2儲存過程的特點 1 執行效率非常快!儲存過程在資料庫服務端執行 2 移值性很差,不同資料庫不能一直 語法 delimiter 宣告結束符號 create procedur...

MySQL模擬Oracle序列sequence

沒發現,這麼多同學有這個需求,把文件補充一下,其實就是建立1個表,和2個儲存過程。利用表的行級鎖模擬每乙個表的序列增減。drop table if exists sys sequence create table sys sequence seq name varchar 50 not null,c...

mysql儲存過程 MySQL儲存過程

在本節中,您將逐步學習如何在mysql中編寫和開發儲存過程。首先,我們向您介紹儲存過程的概念,並討論何時使用它。然後,展示如何使用過程 的基本元素,如建立儲存過程的語句,if else,case,loop,儲存過程的引數。下面每個教程都包含了易於理解的示例和詳細的說明。如果您瀏覽並學習所有教程,您可...