MySQL生成Sequence的一种改进方法

本文介绍了一种优化的MySQL序列生成方法,通过使用临时变量简化了获取序列号的过程,提高了代码的简洁性。详细讨论了如何避免并发操作下序列号的重复,并比较了不同方法的执行效率。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

网上mysql生成Sequence的方法不少,最常见的方法是:

1,创建一张表用来保存序列值

CREATE TABLE `t_sequence` (
  `sequence_name` varchar(64) CHARACTER SET utf8 NOT NULL COMMENT '序列名称',
  `value` int(11) DEFAULT NULL COMMENT '当前值',
  PRIMARY KEY (`sequence_name`)
)

2,创建一个函数用来得到序列号 

CREATE DEFINER=`root`@`localhost` FUNCTION `nextval_safe`(sequence_name varchar(64)) RETURNS int(11)
BEGIN
    declare current integer;
    set current = 0;
    
    select t.value into current from t_sequence t where t.sequence_name = sequence_name for update;
    update t_sequence t set t.value = t.value + 1 where t.sequence_name = sequence_name ;
    set current = current + 1;

    return current;
end

在上述函数中用select ... for update 锁住要修改的数据行,保证在并发操作时不会产生重复的序列号。

其实通过使用临时变量,可以将以上的select ... for update语句与update 语句合二为一。

具体做法如下:

CREATE DEFINER=`root`@`localhost` FUNCTION `nextval_safe_1`(sequence_name varchar(64)) RETURNS int(11)
BEGIN  
    update t_sequence t set t.value = (@current:=t.value+1) where t.sequence_name = sequence_name ;
    return @current;
end

也就是只用了一条update语句就可以实现取序列号的功能。

需要注意的是临时变量的用法,不能写成

update t_sequence t set @current:=t.value+1),t.value= @current: where t.sequence_name = sequence_name ;

这样会导致语法错误。

另外通过简单地测试,发现改进后的函数执行速度似乎和改进前差不多,但形式上更简洁。

 

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值