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

MySQL INSERT…ON重复更新-向自动增量添加1

曹疏珂
2023-03-14
问题内容

我通过一个简单的计数器来跟踪访问我的所有http_user_agents。下面在数据库中插入http_user_agent,此字段不区分大小写,并且是唯一的。因此,当我们尝试将其插入并找到一个DUPLICATE
KEY时,会将1加到hits字段。

问题是即使我们没有插入字段,我的“自动增量”字段仍会增加。我该如何预防呢?

$sql = "INSERT INTO `db_agency_cloud`.`tblRefHttpUsersAgent` SET `http_users_agent` = :UsersAgent, `created_ts` = NOW() ON DUPLICATE KEY UPDATE `hits` = `hits` + 1";

这是表格结构:

CREATE TABLE `tblRefHttpUsersAgent`
(
`id` int(11) unsigned NOT NULL AUTO_INCREMENT,
`http_users_agent` varchar(255) NOT NULL,
`hits` int(20) unsigned NOT NULL DEFAULT '1',
`created_ts` datetime NOT NULL,
`activity_ts` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (`id`),
UNIQUE KEY `http_users_agent` (`http_users_agent`)
)
ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=1;

问题答案:

INSERT ... ON DUPLICATE KEY UPDATE为了InnoDB的AUTO_INCREMENT处理目的,它被称为“混合模式插入”
。基本上,混合模式插入是已知所需值的 最大 数量的插入AUTO_INCREMENT,但 实际上所需的 数量不是。

混合模式插入默认情况下会特别处理,如MySQL
docs中所述

…对于“混合模式插入” …
InnoDB将分配比要插入的行数更多的自动增量值。但是,所有自动分配的值都是连续生成的(因此高于最近执行的先前语句生成的自动增量值)。“多余”的数字丢失。

如果您使用的是InnoDB,则可以选择:

  1. 避免INSERT ... ON DUPLICATE KEY UPDATE
  2. 对于“传统”自动增量锁定模式,请将innodb_autoinc_lock_mode参数设置为0,以确保所有INSERT语句将为AUTO_INCREMENT列分配连续的值。但是,这是通过在语句期间锁定来完成的,因此,此设置会导致性能下降。
  3. (推荐)忽略AUTO_INCREMENT列中的间隙。

注意:AUTO_INCREMENT在MyISAM下,处理方式完全不同,这不会表现出此行为。



 类似资料:
  • 我想向包含数据的现有表中添加一个新的自动递增主列。我该怎么做? 我首先添加了一列,然后尝试添加一个序列,之后我就不知道如何插入该列并将其作为主键。

  • 问题内容: 我刚遇到一个我无法解决的问题。 我有一个用作队列的数据库表,我在其中存储一些记录。处理记录后,它们将被删除。删除是由Rails构建在一个触发MySql数据库的循环中调用的。 但是现在我注意到,在表中将 autoIncrement Id (主键)设置回 1 。(这损坏了我在审计表中的引用。相同记录现在指向多个不同的项目队列) 我不使用或删除表构造,而是在代码中再次创建它。 是否有人遇到像

  • 我的html文件生成一个表: 如何在每次生成新行时将id分配给第一个td?

  • 正如标题所说:如何将水平滚动条添加到我用JFreeChart创建的阴阳烛图表中?我希望用户在放大时能够水平滚动图表。现在放大起作用了,但我不能向左或向右移动。我试着把图表面板放入JScrollPane,但那是一个图表面板,而不是图表本身。我自定义的ChartPanel构造函数: 我的自定义Jboard,我在其中创建图表和图表面板,并将图表面板放在JScrollPane中: 然后,我将MyCandl

  • ...所以我有了@ApplicationScoped Bean“应用程序”: ...并想添加一个字符串到ArrayList Facelet如下所示: ...所以当我尝试添加“blabla@bla.com“,这是结果: 有一个删除按钮显示,但不是字符串本身 请帮忙!谢谢

  • 我有一个表,它有,,和 在常规插入时自动递增。 的值介于1到10之间,因为有10个问题,但对表来说不是唯一的,并且依赖于列。 用于引用单独表中的报表。 我要实现的是,如果对于特定的没有冲突的,则插入新的记录。如果有冲突,则用新的