我无法在更新查询上复制的MySql错误

时间:2016-10-27 12:25:17

标签: mysql

有时候,我并不总是收到以下错误:

  

1040 - 列'avg_visit_duration'不能为空

以下查询

UPDATE `visitors_stats` SET avg_visit_duration = if( avg_visit_duration =0, 41371, round( (
avg_visit_duration * ( visitors_number -1 ) +41371 ) / visitors_number, 2 )
),
max_visit_duration = if( 41371 > max_visit_duration, 41371, max_visit_duration ) ,
min_visit_duration = if( min_visit_duration =0, 41371, if( 41371 < min_visit_duration, 41371, min_visit_duration ) ) WHERE memberid = "74e57e4027c250edc9f1c4d38136d935" AND `date` = "2016-10-27"

问题是,如果我将此查询放入phpmyadmin,它将返回1 row affected0 row affected

我尝试了许多带有空表的组合,其中包含未来日期,以及过去的日期。没有错误返回。

但每天当我查看我的程序登录时,我看到3-4个错误,这并不多,因为执行了大约3-4k个类似的查询,比如今天。

这是表格:

CREATE TABLE IF NOT EXISTS `visitors_stats` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `memberid` varchar(32) NOT NULL,
  `date` date NOT NULL,
  `visitors_number` int(6) NOT NULL DEFAULT '0',
  `avg_visit_duration` double NOT NULL DEFAULT '0',
  `max_visit_duration` double NOT NULL DEFAULT '0',
  `min_visit_duration` double NOT NULL DEFAULT '0'
  PRIMARY KEY (`id`),
  UNIQUE KEY `date` (`date`,`memberid`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8;

可能是什么问题?

更新:许多人回答说问题可能来自

round((avg_visit_duration * ( visitors_number -1 ) +41371 ) / visitors_number, 2 )) 

但是当avg_visit_duration = 0时,visitor_number始终为0,由if条件确定

if( avg_visit_duration =0, 41371, round( ...

然而,当visitor_number = 0时,我强制表格模拟情况,并收到不同的错误:

  

1365 - 除以0

与我的初始错误不同:

  

1040 - 列'avg_visit_duration'不能为空

2 个答案:

答案 0 :(得分:1)

您正在使用:

(avg_visit_duration*(visitors_number-1)+41371)/visitors_number

如果您有visitor_number = 0,则会出现错误,并且不会计算avg_visit_duration的值。

答案 1 :(得分:1)

根据latest documentation

  

如果发生错误,所有数学函数都返回NULL。

这意味着如果您的round()因任何原因失败,它将为空值。

如果visitors_number为0,那么你实际上是在尝试除以0(一个大的不是否),它会抛出一个错误。