mysql - 如果使用这个简单的算法,所有数字在表格中是否都是 100% 唯一的?

标签 mysql sql uniqueidentifier

我的目标是每次在用户机器上发生事件时,使用 ajax 将一个新的和唯一的(唯一性非常重要)数字插入到服务器上的 MySQL 表中。

因此,服务器对用户事件的部分是这样做的(使用 php):

  • 从数据库中的列中找到最大值,
  • 将 10 添加到最大值,
  • 这是一个新的且唯一的(大于最大值)值,我们将插入插入到表中。

如果从 1 开始,是否所有数字都是唯一的并且像 1、11、21、31 一样?我很好奇是否在开始执行另一个队列之前插入到表中并完成,并且可能像 1、11、21、21、31、41?

如果理论上是这样的(按时间排序)

  1. 从第一个用户的列中找到最大值
  2. 从第二个用户的列中找到最大一个值(它将是相同的)
  3. 将第一个用户的 (max+10) 插入到同一个表中
  4. 将第二个用户的(max+10)插入到同一张表中(会是一样的),那么结果是一样的,1个值可以重复两次甚至更多...

因此,问题是:所有数字是否都是 100% 唯一的? 根据这一点,我必须选择用于创建唯一数字的算法。

添加: 是否可以确定使用此算法而不使用自动增量?自动增量用于另一列。数字之间的孔是可以的。唯一的要求是数字应该不同,但有一些大于一的“增量”。抱歉,我在问题中没有注意到这一点。谢谢。

最佳答案

除非您有非常具体的理由反对,否则我建议使用 AUTO_INCREMENT - 与您的方法相比,它的扩展性更好,并且实际上在数字序列中留下的“漏洞”更少。

你是对的——你的方法实际上并不能保证在并发环境中的唯一性。使你的算法工作的一种方法是在你的字段上有一个 UNIQUE 约束(如果它还不是 PRIMARY KEY)然后反复尝试插入一个新值 - 如果它失败只是生成一个新值并重试,它最终会成功。

关于mysql - 如果使用这个简单的算法,所有数字在表格中是否都是 100% 唯一的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8088783/

相关文章:

neo4j - Neo4j 中所有节点/关系的可靠(自动)递增标识符

php - 我想用 php 将西里尔字母发送到 mysqli 数据库

mysql - MySQL 上的 GROUP BY 非常慢。与指数无关

daemon - mysql启动失败

mysql - 优化 MySQL 中的 SELF JOIN。提示 "Lost Connection to MySQL server during Query"

php - 从 MySql 数据库中获取按日期分组的结果

java - 通过Java运行SQL脚本文件

algorithm - 以紧凑的方式使用后缀或前缀对数字进行编码

c# - 无需数据库即可生成唯一编号

php - MySQL Order by,然后更新 Inner Join