php – MySQL INSERT … ON DUPLICATE UPDATE – 将一个添加到自动增量

前端之家收集整理的这篇文章主要介绍了php – MySQL INSERT … ON DUPLICATE UPDATE – 将一个添加到自动增量前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我跟踪所有访问我的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";

这是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值,但实际需要的量不是.

混合模式插入被默认处理,如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处理完全不同,不会出现此行为.

原文链接:https://www.f2er.com/php/139925.html

猜你在找的PHP相关文章