MYSQL 批量Insert ID顺序生成(仿雪花算法)

在数据迁移过程中,面对无主键的情况,该博客介绍了如何在MySQL中创建自定义序列,以兼容原有雪花算法生成的ID。通过定义currval、nextval和setval三个函数,实现了序列的获取、递增和设置,确保了数据的一致性和连续性。在实际应用中,可以将nextval函数应用于INSERT语句中,为新插入的数据生成唯一的主键值。

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

背景

在做数据迁移的时候,数据没有主键,需要自动生成主键,且原有业务数据都是雪花算法生成的ID,为了兼容这种情况,实现方案如下。

MYSQL 的序列生成

  1. 定义序列
DROP TABLE IF EXISTS sequence; 
 
-- 建sequence表,指定seq列为无符号大整型,可支持无符号值:0(default)到18446744073709551615(0到2^64–1)。
CREATE TABLE sequence (
   name       VARCHAR(50) NOT NULL, 
     current_value   BIGINT UNSIGNED NOT NULL DEFAULT 0, 
     increment     INT NOT NULL DEFAULT 1, 
     PRIMARY KEY (name)  -- 不允许重复seq的存在。
) ENGINE=InnoDB; 

set global log_bin_trust_function_creators=1;

 
DELIMITER / 
 
DROP FUNCTION IF EXISTS currval /
 
CREATE FUNCTION currval(seq_name VARCHAR(50)) 
RETURNS BIGINT
BEGIN
     DECLARE value BIGINT;
     SELECT current_value INTO value
     FROM sequence
     WHERE upper(name) = upper(seq_name); -- 大小写不区分.
     RETURN value;
END;
/
 
DELIMITER ; 
 
 
DELIMITER /
 
DROP FUNCTION IF EXISTS nextval /
 
CREATE FUNCTION nextval (seq_name VARCHAR(50)) 
RETURNS BIGINT 
BEGIN 
     DECLARE value BIGINT;
     UPDATE sequence 
     SET current_value = current_value + increment 
     WHERE upper(name) = upper(seq_name);
     RETURN currval(seq_name); 
END;
/
 
DELIMITER ; 
 
DELIMITER /
 
DROP FUNCTION IF EXISTS setval / 
 
CREATE FUNCTION setval (seq_name VARCHAR(50), value BIGINT) 
RETURNS BIGINT
BEGIN 
     UPDATE sequence 
     SET current_value = value 
     WHERE upper(name) = upper(seq_name); 
     RETURN currval(seq_name); 
END;
/
 
DELIMITER ;
  1. 设置序列的初始值
    “myseq” 是序列名称,可以自定义。
    “1987378867709424090”是UUID_SHORT()生成的(17位),去掉前俩位,加了“1987”,总共就是19位了,和雪花算法的长度一致,格式一致。另外雪花算法的前几位是时间戳,因为基本不会重复。
insert into sequence set name='myseq';
select setval('myseq',1987378867709424090);
  1. 验证效果
SELECT nextval('myseq'),zzid from f_s_wl_ys_sxjzcb_copy1;

在这里插入图片描述

nextval(‘myseq’) 放到你的insert语句中即可。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

冷小鱼

多谢鼓励,我会写更多的原创。

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值