我的目标是每次在用户机器上发生事件时,使用 ajax 将一个新的和唯一的(唯一性非常重要)数字插入到服务器上的 MySQL 表中。
因此,服务器对用户事件的部分是这样做的(使用 php):
- 从数据库中的列中找到最大值,
- 将 10 添加到最大值,
- 这是一个新的且唯一的(大于最大值)值,我们将插入插入到表中。
如果从 1 开始,是否所有数字都是唯一的并且像 1、11、21、31 一样?我很好奇是否在开始执行另一个队列之前插入到表中并完成,并且可能像 1、11、21、21、31、41?
如果理论上是这样的(按时间排序)
- 从第一个用户的列中找到最大值
- 从第二个用户的列中找到最大一个值(它将是相同的)
- 将第一个用户的 (max+10) 插入到同一个表中
- 将第二个用户的(max+10)插入到同一张表中(会是一样的),那么结果是一样的,1个值可以重复两次甚至更多...
因此,问题是:所有数字是否都是 100% 唯一的? 根据这一点,我必须选择用于创建唯一数字的算法。
添加: 是否可以确定使用此算法而不使用自动增量?自动增量用于另一列。数字之间的孔是可以的。唯一的要求是数字应该不同,但有一些大于一的“增量”。抱歉,我在问题中没有注意到这一点。谢谢。
最佳答案
除非您有非常具体的理由反对,否则我建议使用 AUTO_INCREMENT - 与您的方法相比,它的扩展性更好,并且实际上在数字序列中留下的“漏洞”更少。
你是对的——你的方法实际上并不能保证在并发环境中的唯一性。使你的算法工作的一种方法是在你的字段上有一个 UNIQUE 约束(如果它还不是 PRIMARY KEY)然后反复尝试插入一个新值 - 如果它失败只是生成一个新值并重试,它最终会成功。
关于mysql - 如果使用这个简单的算法,所有数字在表格中是否都是 100% 唯一的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8088783/