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

 更新时间:2026年05月25日 14:23:02   作者:Hure INGI  
雪花算法在分布式系统中生成全局唯一ID,本文详细介绍了其工作机制,并在SQL中应用生成雪花ID的方法,以实现数据表之间的迁移和补充,确保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;

成功添加~

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • MySQL 8.0新特性 — 管理端口的使用简介

    MySQL 8.0新特性 — 管理端口的使用简介

    这篇文章主要介绍了MySQL 8.0新特性 — 管理端口的使用简介,帮助大家更好的理解和学习使用MySQL,感兴趣的朋友可以了解下
    2021-03-03
  • MySQL关于sql_mode解析与设置讲解

    MySQL关于sql_mode解析与设置讲解

    今天小编就为大家分享一篇关于MySQL关于sql_mode解析与设置讲解,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2019-03-03
  • 将MySQL的临时目录建立在内存中的教程

    将MySQL的临时目录建立在内存中的教程

    这篇文章主要介绍了将MySQL的临时目录建立在内存中的教程,以获得不关机情况下的高性能使用,需要的朋友可以参考下
    2015-04-04
  • MySQL中如何将字符串替换简单示例

    MySQL中如何将字符串替换简单示例

    mysql是一种常用的关系型数据库管理系统,它提供了多种函数来处理和操作数据,下面这篇文章主要给大家介绍了关于MySQL中如何将字符串替换的相关资料,需要的朋友可以参考下
    2024-07-07
  • MySQL数据实时同步Redis的方案全解析

    MySQL数据实时同步Redis的方案全解析

    Canal通过解析MySQL的binlog,实现数据增量同步到Redis,保持数据一致性,核心工作原理是Canal伪装成MySQL从库,模拟从库交互,获取并解析binlog,然后更新到Redis,该方案对业务侵入小,适用于实时数据同步场景,本文介绍MySQL数据实时同步Redis的方法,感兴趣的朋友一起看看吧
    2025-12-12
  • Mysql索引合并的实现示例

    Mysql索引合并的实现示例

    MySQL索引合并通过多索引扫描与结果集合并优化查询,本文主要介绍了Mysql索引合并的实现示例,具有一定的参考价值,感兴趣的可以了解一下
    2025-07-07
  • Mysql大型SQL文件快速恢复方案分享

    Mysql大型SQL文件快速恢复方案分享

    这篇文章主要给大家介绍了关于Mysql大型SQL文件快速恢复方案的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用Mysql具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
    2019-09-09
  • MySQL连表更新实现高效数据同步的实战指南

    MySQL连表更新实现高效数据同步的实战指南

    在数据库开发中,连表更新(JOIN UPDATE)是一种常见且强大的操作,它允许我们基于关联表的数据来更新目标表,本文将深入探讨MySQL连表更新的语法、应用场景、性能优化及常见陷阱,帮助开发者掌握这一核心技能,需要的朋友可以参考下
    2026-02-02
  • win10下mysql5.7.21解压版安装教程

    win10下mysql5.7.21解压版安装教程

    这篇文章主要为大家详细介绍了win10下mysql5.7.21解压版安装教程,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-02-02
  • 详解 MySQL的FreeList机制

    详解 MySQL的FreeList机制

    这篇文章主要介绍了MySQL的FreeList机制的相关资料,帮助大家更好的理解和使用MySQL 数据库,感兴趣的朋友可以了解下
    2020-11-11

最新评论