2026/4/17 13:44:12
网站建设
项目流程
深圳网站建设设计平台,昆明建设局网站,重庆建设建设工程信息网站,广州网站推广策划?? 简介#xff1a;java系列技术分享(??持续更新中…??) ?? 初衷:一起学习、一起进步、坚持不懈 ?? 如果文章内容有误与您的想法不一致,欢迎大家在评论区指正?? ?? 希望这篇文章对你有所帮助,欢迎点赞 ?? 收藏 留言 ?? ?? 更多文章请点击 [这里是图片002]…??简介java系列技术分享(??持续更新中…??)??初衷:一起学习、一起进步、坚持不懈??如果文章内容有误与您的想法不一致,欢迎大家在评论区指正????希望这篇文章对你有所帮助,欢迎点赞 ?? 收藏 留言 ????更多文章请点击[这里是图片002]文章目录一、雪花算法简介二、问题描述(项目场景)三、sql生成雪花算法(已验证)3.1 存储函数创建3.2 测试生成雪花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;成功添加[这里是图片008]