MariaDB ON DUPLICATE KEY UPDATE自动递增

时间:2018-12-21 08:16:14

标签: mysql mariadb innodb

最近我在数据库(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    |
----------------

我了解了这个“问题”,但是并没有真正找到,并回答了如何使自动递增字段不计数(如果仅更新记录的话)。

2 个答案:

答案 0 :(得分:1)

INSERT IGNOREREPLACE,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。