如何实现一个每天从0开始的递增序列
Posted 诺浅
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何实现一个每天从0开始的递增序列相关的知识,希望对你有一定的参考价值。
首先要借助一个函数LAST_INSERT_ID
,这个函数会返回调用这个函数最后一次设置的值。
select LAST_INSERT_ID(); -- 输出0
select LAST_INSERT_ID(11); -- 输出11
select LAST_INSERT_ID(); -- 输出11
我们可以在每次获取这个值的时候用当前值加1
select LAST_INSERT_ID(LAST_INSERT_ID()+1);
好了,我们现在实现了一个递增序列,但是此时还没有实现按日期从零开始,到了第二天这个值还是会递增。此时就需要加一个控制,当日期变化的时候从零开始,而非递增。
新建一张表,给其中的日期(dt)字段添加唯一索引。
CREATE TABLE `co_sn_generator` (
`id` bigint(20) NOT NULL,
`dt` date NOT NULL,
`next` int(11) NOT NULL DEFtAULT '0',
PRIMARY KEY (`id`),
UNIQUE KEY `uk_sn_generator` (`dt`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci
然后每次获取序列前都往这张表插入一条记录,sql语句如下
insert into co_sn_generator(id, dt, next) values(xxx, now(), LAST_INSERT_ID(1))
on duplicate key update next = LAST_INSERT_ID(next + 1);
这样,每天第一条往这张表插入的数据是可以插入成功的,然后执行如下语句会返回1.
select LAST_INSERT_ID(); -- 输出1
当第二次往此表插入时,由于当天数据已经有了,所以会违反dt字段的唯一约束,触发on duplicate key update next = LAST_INSERT_ID(next + 1)
更新操作,更新操作为在当前值的基础上+1,所以再次调用如下语句时会返回2。
select LAST_INSERT_ID();
当隔天时,第一条数据没有违反dt字段的唯一约束,可以插入成功,并且从1开始,第二条又会递增。如此往复。
以上是关于如何实现一个每天从0开始的递增序列的主要内容,如果未能解决你的问题,请参考以下文章