有时候,我并不总是收到以下错误:
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 affected
或0 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'不能为空
答案 0 :(得分:1)
您正在使用:
(avg_visit_duration*(visitors_number-1)+41371)/visitors_number
如果您有visitor_number = 0,则会出现错误,并且不会计算avg_visit_duration
的值。
答案 1 :(得分:1)
如果发生错误,所有数学函数都返回NULL。
这意味着如果您的round()
因任何原因失败,它将为空值。
如果visitors_number
为0,那么你实际上是在尝试除以0(一个大的不是否),它会抛出一个错误。