最近我在数据库(InnoDB)中看到设置为自动增量的“ ID”列确实有点怪异。当我使用
更新记录时INSERT INTO users (user, group) VALUES ('username', 'group') ON DUPLICATE KEY UPDATE username = 'username', group = 'group'
autoincrement会计算ID,所以现在我的表如下所示:
----------------
|id|user |group|
----------------
|1 |test |3 |
|2 |test2|5 |
|5 |foo |2 |
|6 |bar |4 |
|10|user |2 |
----------------
我了解了这个“问题”,但是并没有真正找到,并回答了如何使自动递增字段不计数(如果仅更新记录的话)。
答案 0 :(得分:1)
INSERT IGNORE
,REPLACE
,IODKU(您正在使用)以及其他一些命令将 first 首先分配新的id,然后然后使用它们或“燃烧”它们。忍受它。
在多主服务器和群集环境中,auto_increment_increment
设置为大于1,以便节点可以轻松地相互避开。这会导致很多差距。
由于在事务COMMIT
之前在事务外部看不到id,所以其他查询可以在id = 6可见之前看到id = 7。队列中的某些简单设计严重破坏了邮件。
答案 1 :(得分:1)
我从您的评论中认为,如果您没有填补自动递增主键中的所有空白,您可能会担心整数会用完。
我鼓励你做数学。 INT
是4个字节,并保存的值最大为2 ^ 31-1(对于UNSIGNED INT
,则为2 ^ 32-1)。如果您每秒生成1个自动增量ID(无论是导致插入还是被丢弃),则将持续136年。
如果您仍然担心,请使用具有2 ^ 64-1个不同值的UNSIGNED BIGINT
。这种数据类型将让您在584,542,046年内每秒消耗1000个ID。