MySQL實現類似Oracle序列的方案

2022-09-25 21:00:15 字數 1959 閱讀 3501

mysql實現類似oracle的序列

oracle一般使用序列(sequence)來處理主鍵字段,而my程式設計客棧sql則提供了自增長(increment)來實現類似的目的;

但在實際使用過程中發現,mysql的自增長有諸多的弊端:不能控制步長、開始索引、是否迴圈等;若需要遷移資料庫,則對於主鍵這塊,程式設計客棧也是個頭大的問題。

本文記錄了乙個模擬oracle序列的方案,重點是想法,**其次。

oracle序列的使用,無非是使用.nextval和.currval偽列,基本想法是:

1、mysql中新建表,用於儲存序列名稱和值;

2、建立函式,用於獲取序列表中的值;

具體如下:

表結構為: 

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)

);實現currval的模擬方案

create functioszttlslnn currval(v_seq_name varchar(50))

returns integer

begin程式設計客棧

declare value integer;

set value = 0;

select current_value into value

from sequence

where seq_name = v_seq_name;

return value;

end;

函式使用為:select currval('movieseq');

實現nextval的模擬方案

create function nextval (v_seq_name varchar(50))

return integer

begin

update sequence

set current_val = current_val + increment_val

where seq_name = v_seq_name;

return currval(v_seq_name);

end;

函式使用為:select nextval('movieseq');  

增加設定值的函式

create function setval(v_seq_name varchar(50), v_new_val integer)

returns integer

begin

update sequence

set current_val = v_new_val

where seq_name = v_seq_name;

return currval(seq_name);

同理,可以增加對步長操作的函式,在此不再敘述。

注意語法,資料庫欄位要對應上

use bvboms;

delimiter $$

create function setval(v_seq_name varchar(50)程式設計客棧, v_new_val integer)

returns integer

begin

update sequence

set current_val = v_new_val

where seq_name = v_seq_name;

return currval(seq_name);

end $$

delimiter $$

總結

oracle實現類似split效果

select from select t.regexp substr t.str,1,x.n cc from select a,b,c,d str from dual union all select 11,223,44 from dual t,select rownum n from dual c...

ORACLE用LIMIT實現類似分頁

練習了oracle類似的分頁,目的 oracle的limit使用 declare type name arrary type is varray 20 of varchar2 10 name arrary name arrary type rowss int 輸入頁記錄數 dpno int 輸入部門...

mysql 實現類似開窗函式的功能

mysql8 已經支援開窗函式 sql server 的開窗函式 mysql8 之前的版本不支援開窗函式 目的,取每個channel 按created on 倒序排的前20條 示例如下 有部分冗餘資料 select id,url,channel,created on,rank from select...