MySQL中使用SQL语句生成雪花算法ID(使用存储函数生成Snowflake算法)
一、雪花算法简介
雪花算法(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;
搞定了,成功添加!
本文来自 Dream_sky分享
下载说明:① 请不要相信网站的任何广告;② 当你使用手机访问网盘时,网盘会诱导你下载他们的APP,大家不要去下载,直接把浏览器改成“电脑模式/PC模式”访问,然后免费普通下载即可;③ 123云盘限制,必须登录后才能下载,且限制每人每天下载流量1GB,下载 123云盘免流量破解工具
版权声明:
小编:吾乐吧软件站
链接:https://wuleba.com/3207.html
来源:吾乐吧软件站
本站资源仅供个人学习交流,请于下载后 24 小时内删除,不允许用于商业用途,否则法律问题自行承担。


共有 0 条评论