【问题标题】:Mysql Irregular Auto_Increment incrementMysql 不规则 Auto_Increment 增量
【发布时间】:2022-01-14 05:55:13
【问题描述】:

表格如下。有趣的是,带有 Auto_Increment 的 'id' 列不规则地增加并且很高。


SELECT * FROM `numbers_api` ORDER BY `id` DESC

 id         |  email                |  name
--------------------------------------------
  562984864 | bla[at]blabla.com     |  test
  562956541 | bla1[at]blabla.com    |  test1
  562944637 | bla2[at]blabla.com    |  test2
  562944634 | bla3[at]blabla.com    |  test3

id 的表结构:

我正在对这个表进行如下插入操作(循环中的 $Querys[]):

$Querys[] = "INSERT IGNORE INTO numbers_api (email, name) VALUES ('" . $customerEmail . "', '" . $name . "');";

$this->db->query(implode("\r\n", $Querys));

【问题讨论】:

  • 你能分享一下架构吗?
  • 自动增量列的合同只说生成的值将是唯一的,并且通常会增加,没有别的。如果您需要序列,请在查询时使用您的数据生成它。
  • 运行SHOW CREATE TABLE numbers_api并发布结果into your question
  • 我为id列添加了表结构
  • 表结构 始终为 SHOW CREATE TABLE 语句提供完整且未更改的输出结构。在所有其他情况下,您可以跳过至关重要的细节(包括隐藏添加为当前默认值的细节)。

标签: mysql sql auto-increment


【解决方案1】:

emailname 或它们的组合上可能存在唯一索引。

每次您尝试插入一行时,都会创建一个 ID。但只有当INSERT IGNORE 成功时,即没有违反唯一约束时,才会使用此 ID。

create table numbers_api (id int auto_increment, email varchar(100), name varchar(100));

create unique index idx on table numbers_api (email, name);

INSERT IGNORE INTO numbers_api (email, name) VALUES ('A', 'A');

INSERT IGNORE INTO numbers_api (email, name) VALUES ('A', 'A');
INSERT IGNORE INTO numbers_api (email, name) VALUES ('B', 'B');

INSERT IGNORE INTO numbers_api (email, name) VALUES ('A', 'A');
INSERT IGNORE INTO numbers_api (email, name) VALUES ('B', 'B');
INSERT IGNORE INTO numbers_api (email, name) VALUES ('C', 'C');

表格将包含三行:

id email name
1 A A
3 B B
6 C C

因为在 A|A 上的第二次插入失败,因此浪费了 ID 2,并且在插入第一个 B|B 之后尝试插入 A|A 和 B|B 也失败了,浪费了 ID 4 和 5。

演示:https://dbfiddle.uk/?rdbms=mysql_8.0&fiddle=ca09b5c09ed10116bf27d83935f3e608

【讨论】:

  • 感谢您让我了解您的深厚知识。另外,如果您喜欢我提问的方式,请给他们评分,因为我还没有权利再次提问。
猜你喜欢
  • 2015-03-08
  • 1970-01-01
  • 1970-01-01
  • 2019-06-28
  • 2011-04-05
  • 2011-10-13
  • 1970-01-01
  • 1970-01-01
  • 2011-08-08
相关资源
最近更新 更多