首先要借助一个函数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();

当第二次往此表插入时,由于当天数据已经有了,所以会违反dt字段的唯一约束,触发on duplicate key update next = LAST_INSERT_ID(next + 1)更新操作,更新操作为在当前值的基础上+1,所以再次调用如下语句时会返回2。

select LAST_INSERT_ID();

当隔天时,第一条数据没有违反dt字段的唯一约束,可以插入成功,并且从1开始,第二条又会递增。如此往复。