在 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,儲存過程的引數。下面每個教程都包含了易於理解的示例和詳細的說明。如果您瀏覽並學習所有教程,您可...