MySQL 之自己實現sequence

2021-10-02 17:57:39 字數 2630 閱讀 9990

oracle的sequence是乙個很好的主鍵生成策略,但是mysql並不具有sequence語法,下面在mysql中來模擬實現乙個sequence。

1、建一張表e_sys_sequence用來記錄序列名稱和值

drop

table

ifexists e_sys_sequence;

create

table

e_sys_sequence

( name varchar(64

)not

null

, current_value bigint

notnull

, increment int

notnull

default1,

primary

key(name)

)engine

=innodb

default

charset

=utf8mb4 row_format=dynamic comment

='通用序列表'

;

2、建立取當前值的函式e_sys_sequence.currval

drop

function

ifexists

`e_sys_sequence.currval`

;delimiter $

create

function

`e_sys_sequence.currval`

(seq_name varchar(50

))returns

integer

begin

declare

value

integer

;set

value=0

;select current_value into

value

from e_sys_sequence where name = seq_name;

return

value

;end

$ delimiter

;

3、建立取下乙個值的函式e_sys_sequence.nextval

drop

function

ifexists

`e_sys_sequence.nextval`

;delimiter $$

create

function

`e_sys_sequence.nextval`

(seq_name char(64

))returns

bigint

begin

update e_sys_sequence set current_value=last_insert_id(current_value+increment)

where name=seq_name;

return last_insert_id();

end $$

delimiter

;

4、建立更新當前值的函式e_sys_sequence.setval

drop

function

ifexists

`e_sys_sequence.setval`

;delimiter $

create

function

`e_sys_sequence.setval`

(seq_name varchar(50

),value

integer

)returns

integer

begin

update e_sys_sequence set current_value =

value

where name = seq_name;

return

`e_sys_sequence.currval`

(seq_name)

;end

$ delimiter

;

測試:

--新增乙個sequence名稱和初始值,以及自增幅度  新增乙個名為testseq的自增序列

insert

into e_sys_sequence values

('testseq',0

,1);

--查詢指定sequence的下乙個值,這裡是獲取testseq下乙個值

select

`e_sys_sequence.nextval`

('testseq');

--查詢指定sequence的當前值,這裡是獲取testseq當前值

select

`e_sys_sequence.currval`

('testseq');

---更新指定sequence的初始值,這裡更新testseq的值為10

select

`e_sys_sequence.setval`

('testseq',10

);

MySQL模擬Oracle序列sequence

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

MPI之自己實現Alltoall 函式

mpi alltoall是組內程序之間完全的訊息交換,其中每乙個程序都向其它所有的程序傳送訊息,同時,每乙個程序都從其它所有的程序接收訊息。本質上,它實現的效果就是矩陣的轉置。如果不呼叫系統的mpi alltoall 函式,只用sendrecv send 或recv 該如何實現呢?事實上,只要明白a...

MySQL之索引樹實現

本文章 於 請star 強力支援,你的支援,就是我的動力。toc 為什麼mysql的innodb中的索引要使用b 樹,而不是其它樹?比如b樹?innodb的一棵b 樹可以存放多少行資料?答案 約2千萬 怎麼計算出來的?先從innodb索引資料結構 資料組織 索引實現方式說起。計算機在儲存資料的時候,...