MySQL - 插入 UUID 作为 BIGINT 但检查是否唯一

标签 mysql uuid uniqueidentifier

我正在尝试创建一个可以作为 BIGINT 存储在表中的唯一标识符。

我正在使用预先存在的表,该表使用 BIGINT 作为唯一标识符。数据库本身不会生成标识符,而是由插入值的外部程序来生成标识符。我需要将自己的值插入到该表中,并且在此过程中需要生成一个唯一标识符 BIGINT(24)。

我正在考虑使用SELECT UTC_TIMESTAMP() + 0,但我正在使用的 MySQL 版本中不包含微秒(超出我的控制范围)。

因此,经过一些研究,似乎 SELECT UUID_Short() 是更好的方法。但我担心精度不够。

如果我使用 SELECT UUID_SHORT() 有没有办法在插入之前检查 UUID_Short 中的值是否已存在于表中?我应该提到的是,我真的很想在 SQL 中完成所有这些工作,这样我就可以在数据库中创建一个每 24 小时运行一次的事件。每次事件运行时的插入数量约为 60 条记录,因此我认为性能不会成为问题。

最佳答案

这就是 UUID_SHORT() 值的构造方式

  (server_id & 255) << 56
+ (server_startup_time_in_seconds << 24)
+ incremented_variable++;

如果每次服务器启动运行次数不超过 2^24 = 16,777,216,则保证创建一个唯一的。如果您重新启动 MySQL,incremented_variable 会重置,但您的 server_startup_time_in_seconds 会增加得如此之大,以至于不会与之前的 UUID_SHORT() 产生重复的值已在之前的 MySQL 启动时调用。

关于MySQL - 插入 UUID 作为 BIGINT 但检查是否唯一,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17001056/

相关文章:

php - 使用 where 线索计算数据库行数

javascript - 从 js 页面发送数据后,我无法插入

javascript - 使用 UUID 时 Ajax 调用出错

SQL Server : ISNULL on uniqueidentifier

java - Java Web 应用程序中的唯一序列号

php - 用于大型和可扩展应用程序的数据库表结构

mysql - 为什么在查询中使用 IN(或 NOT IN)子句会使查询变得非常慢

javascript - 在 JavaScript 中生成 UUID 时的冲突

windows - 克隆 Windows 操作系统时 BIOS UUID 会相同吗?

c++ - 获取硬盘/分区序列号