我正在尝试创建一个可以作为 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/