MySQL函数模拟Oracle序列
MySQL模拟Oracle序列
Oracle数据库迁移到MySQL的过程中,需要解决MySQL中没有Oracle的序列功能,本人的解决方案是通过一张表用来记录Oracle中序列的名称、当前序列的值及每次步进长度,通过俩个函数来模拟序列自增,具体代码如下:
建表语句
建表语句
.
CREATE TABLE `sys_sequence` (
`seq_name` varchar(50),
`seq_value` int(18) NOT NULL,
`increment_by` int(18) NOT NULL
)
seq_name:序列名称
curr_value:序列起始值
increment_by:步进长度
查询函数currval
CREATE DEFINER=`labplat`@`%` FUNCTION `currval`(`v_seq_name` varchar(50)) RETURNS int(18)
BEGIN
#Routine body goes here...
DECLARE v_currval int(18);
SET v_currval = 1;
SELECT seq_value INTO v_currval FROM sys_sequence WHERE seq_name = v_seq_name;
RETURN v_currval;
END
更新函数nextval
CREATE DEFINER=`labplat`@`%` FUNCTION `nextval`(`v_seq_name` varchar(50)) RETURNS int(18)
BEGIN
#Routine body goes here...
UPDATE sys_sequence SET seq_value = seq_value + increment_by WHERE seq_name = v_seq_name;
RETURN currval(v_seq_name);
END
分别建好对应的表和函数后,当需要获取序列值的时候,调用nextval()函数,入参为序列名称,nextval()函数会先根据步进长度的值更新对应序列的seq_value值,increment_by为n就更新为seq_value+n,然后nextval()中会调用currval()查到更新后的seq_value值并返回。
MySQL中模拟Oracle序列还有别的方法在次就不一一列举了,此处仅记录自己的解决方案。