MySQL/Sequence

維基教科書,自由的教學讀本

MySQL中沒有實現序列,但MySQL提供了自增(increment)欄位。自增不能設置步長、開始索引、是否循環等;一張表只能有一個自增欄位,有時需要單表多欄位分別自增。為此,模仿Oracle實現自增:

新建序列表作為元數據:

drop table if exists sequence;   
create table sequence (       
 seq_name    VARCHAR(50)  NOT NULL,    -- 序列名称       
 current_val     INT         NOT NULL,             -- 当前值       
 increment_val   INT         NOT NULL    DEFAULT 1, -- 步长(跨度)       
 PRIMARY KEY (seq_name));

新增一個序列的定義:

INSERT INTO sequence VALUES ('seq_test', '0', '1');

創建currval函數,用於獲取給定序列的當前值:

delimiter //  
create function currval(v_seq_name VARCHAR(50))   
returns integer(11) 
begin
 declare value integer;
 set value = 0;
 select current_val into value from sequence where seq_name = v_seq_name;
   return value;
end;
//
delimiter ;

創建nextval函數,用於獲取給定序列的下一個新值:

create function nextval (v_seq_name VARCHAR(50)) returns integer(11) 
begin
    update sequence set current_val = current_val + increment_val  where seq_name = v_seq_name;
    return currval(v_seq_name);
end;