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日志文件详解

    MySQL日志文件详解

    这篇文章主要介绍了MySQL日志文件详解,本文分别讲解了错误日志、二进制日志、通用查询日志、慢查询日志、Innodb的在线redo日志、更新日志等日志类型和作用介绍,需要的朋友可以参考下
    2015-07-07
  • 系统高吞吐量下的数据库重复写入问题分析解决

    系统高吞吐量下的数据库重复写入问题分析解决

    这篇文章主要介绍了系统高吞吐量下的数据库重复写入问题分析解决,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-04-04
  • 一文带你了解MySQL的左连接与右连接

    一文带你了解MySQL的左连接与右连接

    在MySQL中,左查询和右查询是通过使用LEFT JOIN和RIGHT JOIN关键字来执行的,本文通过详细的代码示例简单介绍这两种查询方法的语法,需要的朋友可以参考下
    2023-07-07
  • Mysql系统变量与状态变量详细介绍

    Mysql系统变量与状态变量详细介绍

    这篇文章主要介绍了Mysql系统变量与状态变量详细介绍,能够在程序运行过程中影响Mysql程序行为的变量称之为系统变量,想了解更多相关内容的小伙伴可以参考下面文章内容
    2022-09-09
  • mysql数据库重命名语句分享

    mysql数据库重命名语句分享

    这篇文章主要介绍了mysql数据库重命名语句救命示例,语句中的数据库表前缀换成自己的就可以了,大家参考使用吧
    2014-01-01
  • MySQL分割字符串一行转多行的实现方法

    MySQL分割字符串一行转多行的实现方法

    这篇文章主要介绍了MySQL分割字符串一行转多行,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-06-06
  • mysql类似oracle rownum写法实例详解

    mysql类似oracle rownum写法实例详解

    在本篇文章里小编给大家分享的是关于mysql类似oracle rownum写法以及相关实例内容,需要的朋友们可以学习下。
    2019-09-09
  • MySQL两个表的亲密接触-连接查询的原理分析

    MySQL两个表的亲密接触-连接查询的原理分析

    这篇文章主要介绍了MySQL两个表的亲密接触-连接查询的原理,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-01-01
  • 如何解决MySQL this is incompatible with sql_mode=only_full_group_by问题

    如何解决MySQL this is incompatible with sql_mode=only_full_

    MySQL的ONLY_FULL_GROUP_BY模式要求在使用GROUP BY时,SELECT语句中引用的所有列必须在GROUP BY子句中明确指定,或者是聚合函数的一部分,本文提供了修改SQL语句、使用聚合函数、禁用ONLY_FULL_GROUP_BY等解决方法,并强调了在禁用该模式时应评估其影响
    2024-11-11
  • mysql-5.5.28源码安装过程中错误总结

    mysql-5.5.28源码安装过程中错误总结

    介绍一下关于mysql-5.5.28源码安装过程中几大错误总结,希望此文章对各位同学有所帮助。
    2013-10-10

最新评论