当前位置: 首页 > news >正文

Mysql中使用sql语句生成雪花算法Id

🍓 简介:java系列技术分享(👉持续更新中…🔥)
🍓 初衷:一起学习、一起进步、坚持不懈
🍓 如果文章内容有误与您的想法不一致,欢迎大家在评论区指正🙏
🍓 希望这篇文章对你有所帮助,欢迎点赞 👍 收藏 ⭐留言 📝

🍓 更多文章请点击
在这里插入图片描述在这里插入图片描述

文章目录

  • 一、雪花算法简介
  • 二、问题描述(项目场景)
  • 三、sql生成雪花算法(已验证)
    • 3.1 存储函数创建
    • 3.2 测试生成雪花id
  • 四、实际应用

一、雪花算法简介

雪花算法(Snowflake)是一种生成全局唯一ID的分布式算法。它的主要功能是在分布式系统中生成一个全局唯一的ID,且ID是按照时间有序递增的。

Snowflake算法使用一个64位的二进制数字作为ID。这64位long型ID被分割成四个部分:符号位、时间戳、工作机器ID、序列号。通过这几部分来表示不同的信息,将数据映射到具有特定结构的分布式系统中,实现数据的存储和查询。

在这里插入图片描述

二、问题描述(项目场景)

将A表中的指定数据补偿到B表中,B表id是bigint类型的雪花算法(原始数据是代码生成的雪花算法id),我这里只做补偿使用sql实现,

这里就需要给id赋值,并且满足之前原表的数据规则

insert into select -将一个表的数据添加到另外一个表中

-- insert into select -将一个表的数据添加到另外一个表中
insert into table_name2(id, project_code)
select 雪花算法id, project_code from table_name1 where type = 1;

三、sql生成雪花算法(已验证)

3.1 存储函数创建

SET @last_timestamp = -1; -- 初始化全局变量
SET @sequence = 0; -- 初始化全局变量

DROP FUNCTION IF EXISTS generate_snowflake_id;
DELIMITER //
CREATE FUNCTION generate_snowflake_id() RETURNS BIGINT
    READS SQL DATA
BEGIN
    DECLARE timestamp BIGINT;
    DECLARE machine_id BIGINT DEFAULT 1; -- 假设机器 ID 为 1
    DECLARE data_center_id BIGINT DEFAULT 0; -- 假设数据中心 ID 为 0
    DECLARE epoch BIGINT DEFAULT 1288834974657;
    -- 2010-01-01 00:00:00 UTC 的毫秒数

    -- 获取当前时间戳(毫秒)
    SET timestamp = FLOOR(UNIX_TIMESTAMP(NOW(3)) * 1000) - epoch;

    -- 检查当前时间戳
    IF timestamp = @last_timestamp THEN
        SET @sequence = (@sequence + 1) % 4096; -- 在同一毫秒内递增序列号
    ELSE
        SET @sequence = 0; -- 不同毫秒重置序列号
    END IF;

    SET @last_timestamp = timestamp;
    -- 存储当前时间戳

    -- 生成雪花 ID
    RETURN (timestamp << 22) | (data_center_id << 17) | (machine_id << 12) | @sequence;
END //
DELIMITER ;

3.2 测试生成雪花id

-- 测试生成 Snowflake ID
SELECT generate_snowflake_id();

在这里插入图片描述

四、实际应用

insert into table_name2(id, project_code)
select generate_snowflake_id(), project_code from table_name1 where type = 1;

成功添加
在这里插入图片描述

在这里插入图片描述在这里插入图片描述

相关文章:

  • Linux内核模块参数与性能优化:__read_mostly属性的深度剖析
  • 前端开发所需参考文档—重中之中
  • postman登录cookie设置
  • 【目标检测xml2txt】label从VOC格式xml文件转YOLO格式txt文件
  • 利用IDEA将Java.class文件反编译为Java文件:原理、实践与深度解析
  • 建筑兔零基础自学python记录18|实战人脸识别项目——视频检测07
  • Docker 部署 MongoDB | 国内阿里镜像
  • 大模型Deepseek的使用_基于阿里云百炼和Chatbox
  • 全面解析鸿蒙(HarmonyOS)开发:从入门到实战,构建万物互联新时代
  • rabbitmq详解
  • VLLM历次会议(2024.4)
  • vue2老版本 npm install 安装失败_安装卡主
  • 【PL/SQL】常用操作复习20250212
  • 大型语言模型的核心机制解析
  • 随着人们网络安全意识提高,软件架构设计与评估也成为重中之重
  • 新一代SCADA: 宏集Panorama Suite 2025 正式发布,提供更灵活、符合人体工学且安全的应用体验
  • 【工业安全】-CVE-2019-17621-D-Link Dir-859L 路由器远程代码执行漏洞
  • 美团一面,有点难度。
  • verilog练习:i2c slave 模块设计
  • zyNo.22
  • 新华时评:网络平台“开盲盒式”扣费,“钱小”事大
  • 春决火爆的背后,PEL如何做大这块电竞蛋糕
  • 上影节开幕影片《酱园弄·悬案》,陈可辛执导,章子怡主演
  • 上海电视节评委会名单公布,陈宝国担任电视剧评委会主席
  • 东南亚五大经济体一季度增长放缓,美国关税大棒或阻全年增长
  • 甘肃白银煤矿透水事故仍有3人失联,现场约510立方米煤泥拥堵巷道