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

 更新时间:2025年02月16日 09:10:13   作者:Dream_sky分享  
雪花算法是一种生成全局唯一ID的分布式算法,本文主要介绍了Mysql中使用sql语句生成雪花算法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中使用sql语句生成雪花算法Id的文章就介绍到这了,更多相关Mysql中使用sql语句生成雪花算法Id内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Windows 64位重装MySQL的教程(Zip版、解压版MySQL安装)

    Windows 64位重装MySQL的教程(Zip版、解压版MySQL安装)

    这篇文章主要介绍了Windows 64位,重装MySQL的方法(Zip版、解压版MySQL安装),本文给大家介绍的非常详细,具有一定的参考借鉴价值需要的朋友可以参考下
    2020-02-02
  • MYSQL聚合查询、分组查询、联合查询举例详解

    MYSQL聚合查询、分组查询、联合查询举例详解

    我们做的很多查询都是横向查询,它们都是根据条件一行一行的进行判断,而使用聚合函数查询是纵向查询,它是对一列的值进行计算,然后返回一个单一的值,这篇文章主要介绍了MYSQL聚合查询、分组查询、联合查询的相关资料,需要的朋友可以参考下
    2024-09-09
  • Java的Struts框架中的主题模板和国际化设置

    Java的Struts框架中的主题模板和国际化设置

    这篇文章主要介绍了Java的Struts框架中的主题模板和国际化设置,Struts是Java的SSH三大web开放框架之一,需要的朋友可以参考下
    2015-12-12
  • mysql排查锁等待的解决方法

    mysql排查锁等待的解决方法

    最近线上碰到了几次mysql锁等待的问题,本文主要介绍了mysql排查锁等待的解决方法,具有一定的参考价值,感兴趣的可以了解一下
    2024-08-08
  • Mysql5.7.18的安装与主从复制图文详解

    Mysql5.7.18的安装与主从复制图文详解

    这篇文章主要介绍了Mysql5.7.18的安装与主从复制图文详解,需要的朋友可以参考下
    2017-08-08
  • MySQL的数据类型和建库策略分析详解

    MySQL的数据类型和建库策略分析详解

    无论是在小得可怜的免费数据库空间或是大型电子商务网站,合理的设计表结构、充分利用空间是十分必要的。这就要求我们对数据库系统的常用数据类型有充分的认识。下面我就将我的一点心得写出来跟大家分享。
    2008-04-04
  • MySql安装与卸载的详细教程

    MySql安装与卸载的详细教程

    这篇文章主要为大家介绍了MySql安装与卸载的详细教程,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-07-07
  • MySQL OOM(内存溢出)的解决思路

    MySQL OOM(内存溢出)的解决思路

    这篇文章主要介绍了MySQL OOM(内存溢出)的解决思路,文中讲解非常细致,帮助大家在学习工作中解决内存溢出的问题,感兴趣的朋友可以了解下
    2020-08-08
  • MySQL 8.0.29 解压版安装配置方法图文教程

    MySQL 8.0.29 解压版安装配置方法图文教程

    这篇文章主要为大家详细介绍了MySQL 8.0.29 解压版安装配置方法图文教程,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-06-06
  • mysql 导入导出数据库、数据表的方法

    mysql 导入导出数据库、数据表的方法

    这篇文章主要介绍了mysql 导入导出数据库、数据表的方法,有需要的朋友可以参考一下
    2013-11-11

最新评论