我跟踪所有访问我的http_user_agents,一个简单的命中计数器.
以下将数据库中的http_user_agent插入,该字段为“不区分大小写”,为唯一.所以当我们尝试插入它并找到一个DUPLICATE KEY时,它会将1添加到hits字段.
以下将数据库中的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";
这是Table结构:
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值,但实际需要的量不是.
原文链接:https://www.f2er.com/php/139925.html混合模式插入被默认处理,如MySQL docs中所述:
…for “mixed-mode inserts”… InnoDB will
allocate more auto-increment values than the number of rows to be
inserted. However,all values automatically assigned are consecutively
generated (and thus higher than) the auto-increment value generated by
the most recently executed prevIoUs statement. “Excess” numbers are
lost.
如果您使用InnoDB,您的替代方案是:
>避免INSERT … ON DUPLICATE KEY UPDATE.
>将innodb_autoinc_lock_mode
参数设置为0,对于“传统”自动增量锁定模式,这保证所有INSERT语句都将为AUTO_INCREMENT列分配连续的值.但是,这通过在语句中锁定来实现,因此与此设置相关联的性能损失.
>(推荐)忽略AUTO_INCREMENT列中的空白.
注意:在MyISAM下,AUTO_INCREMENT处理完全不同,不会出现此行为.