警告超出条件更新的范围值列

erhoui1w  于 2021-06-17  发布在  Mysql
关注(0)|答案(1)|浏览(293)

我有一个单一的查询来更新一个表,一些字段应该在条件下更新,让我们想象一下这种情况:
我有一张table叫mytable,它有一个 DATETIME 字段名为installed,此字段可以为null,默认为null,有时某些值为“0000-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

它按预期工作,如果installed为null,它将存储当前时间,如果不是,它将保留前一个日期,但我在日期为'0000-00-00:00:00'时收到此警告:
警告:第1行“installed”列的值超出范围
正如d-shih所建议的,我尝试使用coalesce,如下所示,但得到了相同的警告:

installed=COALESCE(installed,NOW())

我以为是因为之前的日期,所以,我故意复制错误:

UPDATE mytable SET
installed=installed,
WHERE id=12457

但我没有收到任何警告。
系统工作正常,但我有点好奇,为什么我只使用if(或coalesce)函数得到这个警告?
回答madhur bhaiya: SHOW CREATE TABLE 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
7z5jn7bk

7z5jn7bk1#

你有 0000-00-00 00:00:00 作为价值也在 installed 列。你需要处理好它们,除了 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

相关问题