当前位置: 首页 > 面试题库 >

INSERT IGNORE会增加自动递增计数器,即使未添加任何记录也是如此?

微生乐
2023-03-14
问题内容

MySQL中, 我使用了INSERT IGNORE语句将行插入到表中。由于一列是UNIQUE,因此未插入某些行(因为它们已经在那里)。执行完该语句后,我注意到自动递增列在行之间缺少一些数字,后来我意识到这是由于忽略和未添加行而导致的。

如果没有在子句中插入行,是否可以将系统设置为不增加 自动递增计数器IGNORE


问题答案:

从INSERT的手册页中引用:

如果使用IGNORE关键字,则在执行INSERT语句时发生的错误将被视为警告。例如,如果没有IGNORE,则复制表中现有UNIQUE索引或PRIMARY
KEY值的行将导致重复键错误,并且该语句将中止。使用IGNORE,仍不会插入该行,但是不会发出错误。

INSERT IGNORE语法只是为了抑制某些错误消息的方式,当你意识到这些错误可能发生和/或希望在以后的阶段来处理他们这是有帮助的。在幕后,您仍然有一个常规的插入内容,只是由于密钥被破坏而导致插入失败。MySQL需要实际的行值进行插入,并且AUTO_INCREMENT计数器将根据常规规则递增:

  1. 该列的值为NULL。
  2. 未设置该列的值。
  3. 该列的值大于计数器。

因此,除非您可以重新考虑逻辑(例如,在进行插入之前测试键值是否存在),否则 重置 计数器的唯一方法是ALTER
TABLE

ALTER TABLE t2 AUTO_INCREMENT = value;


 类似资料:
  • 问题内容: 当我从用户那里接收数据时,我每次都会验证输入的格式(PHP)。我唯一无法验证(或我不想)的是约束(例如外键)违规。我让DML引发并出错,并让数据库驱动程序引发异常。捕获它后,我只是通过MySQL的错误代码打印出一些错误消息。 问题是,即使插入失败,我仍然看到序列还在增长。我该如何预防呢? 问题答案: 这就是自动增量值和序列的工作方式。使用值时,如果事务失败,则不会回收该值,并且会回滚该

  • 问题内容: 我有一个带有SQL插入SQL Server 2005数据库的.net事务。该表具有一个身份主键。 当事务内发生错误时,将被调用。行插入将正确回滚,但是,下次我将数据插入表时,标识将增加,就好像从未发生过回滚一样。因此,本质上在同一性序列中存在缺口。有什么方法可以让该方法回收丢失的身份? 我不是用正确的方法吗? 问题答案: 如果您考虑一下,则自动递增号 不应 是事务性的。如果其他事务必须

  • 问题内容: 假设我有一个表,该表具有一个字段,该字段指示使用给定标记标记了多少个。 添加带有现有标签的新项目后,如何在SQLAlchemy中增加此计数器? 使用普通SQL,我将执行以下操作: 但是我如何用SQLAlchemy表达? 问题答案: 如果您有类似的东西: 您可以像这样增加字段: 或者,如果您有一些映射的模型,则可以选择编写: 这两个版本都将返回您要求的sql语句。但是,如果您不包括该列并

  • 问题内容: 在MySQL中,是否可以在自动递增前面附加一个字母。我的数据库中有几个表,其中一些表具有通过自动增量创建的唯一ID。我希望能够通过前面的字母来区分自动生成的数字。 这不是绝对必需的功能,但只会帮助简化小型任务。 问题答案: 不幸的是你不能那样做。至少不是在sql中。自动增量字段是整数类型,因此在其中添加字母会违反约束。 我希望这可以引导您朝正确的方向发展。

  • 问题内容: 我有一个带有自动递增主键的表。该表旨在存储数百万条记录,我现在不需要删除任何内容。问题是,当插入新行时,由于某些错误,自动增量键在自动增量ID中保留了一些间隙。例如,在5之后,下一个ID为8,而间隙为6和7 。结果是当我计算行数时,结果为28000,但最大id为58000。我没有删除任何内容。以及如何解决此问题。 PS我在插入记录时使用插入忽略,以便当我尝试在唯一列中插入重复项时不会出

  • 问题内容: 我有一个PreparedStatement,例如: 如您所见,Employee表具有一个自动递增的ID。我基本上也需要使用prepareStatement自动添加它。有人可以告诉我我要去哪里哪里并纠正我吗?现在,这只是给我一个与Statement相关的错误。 问题答案: 将该列 完全 放在语句之外。它将由数据库引擎生成。您的查询应为: __ 其次,您必须先执行插入操作,然后再从结果中取