我有一个查询来更新表,并且一些字段应该在条件下更新,让我们想象一下这种情况:
我有一个名为mytable的表,它有一个名为installed的DATETIME
字段,该字段可以为空,并且默认为空,有时某些值为“0000-00-00 00:00:00”。
当我从任何传感器获取数据(例如:传感器 id 12457)时,我会像这样更新其值:
UPDATE mytable SET
temperature=35,
pressure=122,
installed=NOW(),
status=1
WHERE id=12457
如果我从同一个传感器获得新数据,我会再次存储其值,但我会避免以这种方式更改安装的值:
UPDATE mytable SET
temperature=35,
pressure=122,
installed=IF(installed IS NULL,NOW(),installed),
status=1
WHERE id=12457
它按预期工作,如果安装为空,则存储当前时间,如果不是,则保留之前的日期,但当日期为“0000-00-00 00:00:00”时,我收到此警告:
警告:第 1 行“已安装”列的值超出范围
按照D-Shih的建议,我尝试使用 COALESCE 如下,但我得到了相同的警告:
installed=COALESCE(installed,NOW())
我认为这是因为前一个日期,所以,我尝试故意这样做重现错误:
UPDATE mytable SET
installed=installed,
WHERE id=12457
但我没有收到任何警告。
系统工作正常,但我有点好奇,为什么我仅使用 IF(或 COALESCE)函数收到此警告?
<小时/>回答Madhur Bhaiya:
显示创建表 mytable
CREATE TABLE `mytable` (
`id` INT(11) NOT NULL AUTO_INCREMENT,
`temperature` INT(11) NOT NULL DEFAULT '0',
`pressure` INT(11) NOT NULL DEFAULT '0',
`installed` DATETIME NULL DEFAULT NULL,
`status` INT(11) NOT NULL DEFAULT '0',
PRIMARY KEY (`id`)
)
示例数据:
INSERT INTO `mytable` VALUES (12457, 35, 122, '2018-12-12 12:53:49', 1);
INSERT INTO `mytable` VALUES (12458, 40, 119, '0000-00-00 00:00:00', 1);
INSERT INTO `mytable` VALUES (12459, 34, 122, null, 1);
INSERT INTO `mytable` VALUES (12460, 36, 122, '2018-12-12 12:57:01', 1);
MySQL版本:5.7.23
最佳答案
installed
列中也有 0000-00-00 00:00:00
作为值。除了 null
值之外,您还需要处理它们。此外,在运行查询之前,您需要将 sql_mode
设置为 ''
,因为它将删除更严格的 NO_ZERO_DATE
SQL 模式。
SET SESSION sql_mode = '';
UPDATE mytable
SET
temperature = 35,
pressure = 122,
installed = IF(installed IS NULL OR installed = '0000-00-00 00:00:00',
NOW(),
installed),
status=1
WHERE id=12457
关于mysql - 警告超出条件更新的值列范围,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53743895/