【问题标题】:MySQL - Duplicated values in auto-incremented fieldMySQL - 自动增量字段中的重复值
【发布时间】:2020-07-27 14:35:41
【问题描述】:

我有一个分区的 InnoDB 表,看起来像这样:

CREATE TABLE `actions` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `id_user` int(11) NOT NULL,
  `created_at` datetime NOT NULL,
  PRIMARY KEY (`id`,`id_user`),
  KEY `id_user` (`id_user`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci
/*!50100 PARTITION BY RANGE (id_user)
(PARTITION p01 VALUES LESS THAN (100000) ENGINE = InnoDB,
 PARTITION p02 VALUES LESS THAN (200000) ENGINE = InnoDB,
 PARTITION p03 VALUES LESS THAN (300000) ENGINE = InnoDB,
 PARTITION p04 VALUES LESS THAN MAXVALUE ENGINE = InnoDB) */;

此表上每分钟有数万次插入和更新。
有时,我会在 id 中得到重复的值,这是一个自动增量字段。
插入没有指定 id。一次可以插入单行或多行。
我使用的是 MySQL 5.7.26,其中涉及复制,但发生这种情况时没有重新启动,并且所有插入都是在同一台服务器上进行的。

这些是一些设置:

innodb_autoinc_lock_mode 1
auto_increment_increment 1

有没有办法避免这种情况发生?

【问题讨论】:

  • 交易怎么样?
  • 报告了有关重复 AI 值的错误。 bugs.mysql.com/bug.php?id=76872 在 5.6.35、5.7.17、8.0.1 版本中已修复,如果您使用的是这些之前的版本(在相应的分支中),请升级。
  • 另一个关于重复 AI 值的 bug 被打开,目前还没有修复。 bugs.mysql.com/bug.php?id=88321 在版本 5.6.35、5.7.20、8.0.12 中得到验证。如果该错误中的测试用例与您的用法相匹配,您应该单击该错误上的“影响我”按钮。
  • @BillKarwin 谢谢。我使用的版本是 5.7.26。我会更新问题
  • innodb_autoinc_lock_modeauto_increment_increment 的设置是什么?

标签: mysql innodb


【解决方案1】:
PRIMARY KEY (`id`,`id_user`)

表示列是唯一的。

确实允许id 中有重复项。但是这种情况很少发生,因为用户通常INSERTing 时不会为 auto_inc 列指定值。

(这是PARTITIONs的另一个缺点。)

向我们展示您的INSERT 的样本。

【讨论】:

  • 更新了问题。