如何实现一个每天从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开始的递增序列的主要内容,如果未能解决你的问题,请参考以下文章

LeetCode刷题 最长递增子序列

数组674. 最长连续递增序列

算法总结之 最长递增子序列

php 数组索引值如何重新从0开始递增

列表和元组

怎样在excel下拉中字母递增?