为什么ON DUPLICATE KEY UPDATE语句将值增加2而不是1?

时间:2010-12-23 15:22:10

标签: mysql insert

什么会导致ON DUPLICATE KEY UPDATE语句将值增加2而不是1, 这是SQL即时使用:

INSERT INTO banner_view (banner_id,date,views) 
VALUES ('10',CURDATE(),'1')
ON DUPLICATE KEY UPDATE views=(views+1)

这是数据库架构:

CREATE TABLE `banner_view` (
`banner_id`  int(11) UNSIGNED NOT NULL ,
`date`  date NOT NULL ,
`views`  int(10) UNSIGNED NOT NULL ,
PRIMARY KEY (`banner_id`, `date`),
FOREIGN KEY (`banner_id`) REFERENCES `banner` (`banner_id`) ON DELETE CASCADE ON UPDATE CASCADE,
UNIQUE INDEX `banner_id` USING BTREE (`banner_id`, `date`)
)
ENGINE=InnoDB
DEFAULT CHARACTER SET=utf8 COLLATE=utf8_general_ci
ROW_FORMAT=COMPACT
;

我已经检查了MySQL日志,以确保查询被正确调用3次,但输出将是6,可能是什么错误?

更新: 这个方法在smarty模板中调用,如: {app_banner :: getRandomBanner()}

5 个答案:

答案 0 :(得分:2)

检查你的代码中是否没有两次调用查询 - 它本身就可以正常工作。

答案 1 :(得分:1)

此查询将增加多个值的唯一原因是,如果它被多次调用。在调用查询的位置将echo ('<p>Query being run</p>')放入代码中。您应该看到它一次,如果您不止一次看到它,那么代码将被多次运行。

在这种情况下,交互式调试也可能非常有用,如果您安装了xdebug之类的调试模块,您可以使用它来单步执行代码并查看它正在做什么。

答案 2 :(得分:1)

桌子上有triggers的任何可能吗?

SHOW TRIGGERS LIKE 'banner%'\G

答案 3 :(得分:1)

Silver Light是正确的,您正在调用代码两次。如果您没有在代码中明确地这样做,即:

inc3x();
inc3x();

然后,您可能正在加载该页面两次。如果在文档中包含空src,则会发生这种情况。例如:

<script src=""></script>

使用浏览器检查所有正在加载的资源文件。

答案 4 :(得分:0)

我遇到了这个问题,并将其缩小为以下CSS代码:

body {
   background-image:url();
}

如果没有为background-image指定图片网址,则会导致整个网页在某些浏览器中重新加载(如文档here所述)。我遇到了Chrome(第23版)的问题,但不是IE 10。