当前位置: 代码网 > it编程>数据库>Mysql > Mysql中使用sql语句生成雪花算法Id

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

2025年02月17日 Mysql 我要评论
一、雪花算法简介雪花算法(snowflake)是一种生成全局唯一id的分布式算法。它的主要功能是在分布式系统中生成一个全局唯一的id,且id是按照时间有序递增的。snowflake算法使用一个64位的

一、雪花算法简介

雪花算法(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内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2025  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com