问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

MySQL实现类似Oracle序列的方案

发布网友 发布时间:2022-04-21 18:20

我来回答

1个回答

热心网友 时间:2022-04-07 23:56

MySQL实现类似Oracle的序列
Oracle一般使用序列(Sequence)来处理主键字段,而MySQL则提供了自增长(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
function
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
$$
总结
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对脚本之家的支持。如果你想了解更多相关内容请查看下面相关链接
您可能感兴趣的文章:mysql实现sequence功能的代码Can''t
connect
to
local
MySQL
through
socket
''/tmp/mysql.sock''解决方法Mysql常用函数大全(分类汇总讲解)利用MySQL主从配置实现读写分离减轻数据库压力mysql+spring+mybatis实现数据库读写分离的代码配置Golang中如何对MySQL进行操作详解将图片储存在MySQL数据库中的几种方法MySQL存储文本和图片的方法Ubuntu上mysql的安装及使用(通用版)nodejs同步调用获取mysql数据时遇到的大坑
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
你觉得hx100在长焦机中怎样?处于什么水平? 索尼DSC-HX100显示功能 美的kfr-51lw/ y- pa1是什么故障代码 索尼DSC-HX100V基本参数 索尼DSC-HX100显示功能 索尼DSC-HX100主要参数 金龙鱼深海鱼油好不好? Y一60C81显示E5什么故障? 索尼DSCHX100质量如何 索尼DSC-HX100存储性能 怎样做蛋挞液简单? 在mysql 里 怎样实现类似ORACLE 中next_day方法的... 蛋挞液如何弄 蛋挞液怎么做 制作方法 自己怎么弄蛋挞液 蛋挞液是怎么做成的 蛋挞液是什么做的 static 和 const 能不能同时用来修饰一个函数,为... C51中static的用法 C语言里的static怎么用的,能给个代码说说么? c语言static的用法 谁能告诉我static在java中的解释和具体的用法? static这个函数 C++中static用法 static 在单片机c语言用用法 c语言static的使用 static在51单片机中几种用法 c++中static函数用法说明 Static是什么意思啊,在C程序里面 static 在哪用的到,以及为什么要用 怎么弄蛋挞液 OPPO Find X3值得入手吗? mysql 有没有类似 oracle lag函数 如何制作好吃家蛋挞液 mysql中有和Oracle中的nvl2(expr1,expr2,expr3)效... mysql 函数中与Oracle中ltrim函数功能相同的函数是... OPPOfindx3和华为mate40买那个? 请教一下mysql下有没有类似oracle的函数max over p... mysql nextval函数在别的库怎么取 华为oppo手机哪个系列的手机,推荐一些好用性价比高? mysql里有没有类似oracle里的ADD_MONTHS函数,自能... 有没有oracle函数与mysql函数转化的工具 mysql中now()函数在oracle中怎么用 ORACLE分析函数能在MYSQL里实现吗? 用MYSQL的存储过程 oracle数据库和mysql数据库的区别 想问下买OPPO Find X3还是买小米K40好? MySQL的存储过程当中,有没有类似于Oracle的表类型 数据库中nextval是什么意思 sql语句实现递归查询所有节点,mysql和oracle都能用的 mysql 与oracle中的存储过程及函数有什么区别,尽...