mysql如何实现自增长的列

js14982 2020-06-02 03:51:06
比如今年,自增长的列
20200001
20200002
20200003
...
一直往下增长
20209999
到2021年,从头开始计算初始值
20210001
20210002
20210003
...
20219999

最大值预计不会超过9999,不考虑溢出。由于是insert操作,concat(year(now()),lpad(id,4,0)) 这样的也取不到当前自动增长的id值,另不会跨年份自动重置初始值,对mysql不是很熟
...全文
66 点赞 收藏 4
写回复
4 条回复
带我飞的云 2020年06月03日
我写了一个方法如下,是可以生成id的值的
set global log_bin_trust_function_creators=TRUE;-- 非必须,跟你mysql的设置有关,如果没有这句话,可能会创建function失败
DELIMITER $$
Create function getid()
returns int
begin
declare maxid int;
declare generateId int;
declare result int;
select max(id) into maxid from a; -- 取出a表中最大的id值
select year(now()) * 10000 into generateId; -- 根据年份生成一个0开始的id值, 类似:20200000
if generateId > maxid then -- 如果生成的年份的id值大于a表中的id值, 类似:20190010, 20200101
set result = generateId + 1; -- 那么新的id值就是当前年份的id值加1,即返回 20200001
else
set result = maxid + 1; -- 否则在max(id)的值加1
end if;
return result;
end $$

这个方法创建成功后,直接使用select getid() 就可以生成一个id值
如果你的Mysql 版本是5.7之后的,Generated Column的特性,把函数写在Expression里
如果不是5.7版本的,就在插入数据时,使用getid()方法自动获取就好了
回复 点赞
js14982 2020年06月03日
这个函数是没啥问题的,可是那边需求又有变动,先就这样吧,其他的我自己先想想
回复 点赞
js14982 2020年06月02日
连不连续不太重要,主要是年份这个重置初始的问题
引用 1 楼 带我飞的云 的回复:
是必须要求自增长列连续么? 如果要求必须连接的话,不能使用mysql 的AUTO_INCREMENT, 因为AUTO_INCREMENT无法保证连接 Mysql有一个Generated列的功能,可以在里面写Expression , 前面的年份可以用year函数,但是后面的id部分,可能是自己给值了
回复 点赞
带我飞的云 2020年06月02日
是必须要求自增长列连续么?
如果要求必须连接的话,不能使用mysql 的AUTO_INCREMENT, 因为AUTO_INCREMENT无法保证连接

Mysql有一个Generated列的功能,可以在里面写Expression , 前面的年份可以用year函数,但是后面的id部分,可能是自己给值了
回复 点赞
发动态
发帖子
MySQL
创建于2007-09-28

2.4w+

社区成员

5.5w+

社区内容

MySQL相关内容讨论专区
社区公告
暂无公告