MySQL用SQL生成雪花ID

文章详细描述了如何在MySQL中使用特定公式生成一个19位的自编ID,同时提及了如何查询`test`数据库中的`t_project`表的相关信息。

这里写自定义目录标题

样例

  • ID1是纯随机数
  • ID2用到当前数据表的信息
SELECT
	CONCAT(
		'1',
		DATE_FORMAT( NOW(), '%H' ),
		LPAD( FLOOR( RAND() * 1000000 ), 6, 0 ),
		DATE_FORMAT( NOW(), '%i%s' ),
	LPAD(( SELECT @rowno := @rowno + 1 FROM ( SELECT @rowno := 0 ) t ) * 71, 4, 0 )) ID1,
	(
	SELECT
		CONCAT(
			LEFT ( UNIX_TIMESTAMP( tis.create_time ), 3 ),
			RIGHT ( UNIX_TIMESTAMP( NOW()), 7 ),
			LPAD((
					tis.DATA_LENGTH + tis.table_rows + tis.avg_row_length + tis.MAX_DATA_LENGTH + tis.INDEX_LENGTH + DATA_FREE + ( SELECT @rowno := @rowno + 1 FROM ( SELECT @rowno := 0 ) t ) * 71 
					) * 1777,
				9,
				0 
			)) 
	FROM
		information_schema.TABLES tis 
	WHERE
		tis.TABLE_SCHEMA = 'test' 
		AND TABLE_NAME = 't_project' 
	) id2,
	NAME
FROM
	test.t_project;

参考

MySQL 生成自编的19位雪花算法ID

【MySQL】查看库表信息

### 实现雪花算法ID生成MySQL 中可以通过 SQL 语句模拟雪花算法生成唯一 ID。给定的 SQL 表达式展示了如何利用时间戳和随机数位组合成一个类似于雪花算法结构的 ID[^1]。 ```sql SELECT ( REPLACE(UNIX_TIMESTAMP(CURRENT_TIMESTAMP(3)), '.', '') - 1420041600000 ) << 22 | FLOOR(RAND() * (1 << 22)) AS id; ``` 此查询构建了一个由两部分组成的整数值: - **时间戳偏移量**:`REPLACE(UNIX_TIMESTAMP(CURRENT_TIMESTAMP(3)), '.', '') - 1420041600000` 计算自纪元以来的时间差,单位为毫秒,并减去起始时间戳 `1420041600000`(对应于 UTC 时间 2015 年 1 月 1 日),这模仿了 Twitter Snowflake 的设计思路。 - **随机序列号**:`FLOOR(RAND() * (1 << 22))` 使用伪随机数乘以最大可能值 `(1 << 22)` 来填充低 22 位的位置,确保即使在同一毫秒内也能产生不同的 ID 值。 上述方法虽然可以用于简单场景下的分布式环境中的唯一键创建,但在实际生产环境中部署时需要注意几点事项: - 此方案依赖于数据库服务器的时间同步精度; - 随机组件并非严格意义上的全局唯一性保障机制,在高并发情况下可能会遇到冲突风险; - 对于更复杂的应用需求,建议采用专门编写的程序逻辑配合存储过程或其他高级特性实现更加健壮可靠的解决方案[^2]。 为了提高稳定性和性能表现,通常会开发独立的服务或库来处理这类任务而不是完全依靠纯 SQL 查询完成整个流程。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值