我有一个单一的查询来更新一个表,一些字段应该在条件下更新,让我们想象一下这种情况:
我有一张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
1条答案
按热度按时间7z5jn7bk1#
你有
0000-00-00 00:00:00
作为价值也在installed
列。你需要处理好它们,除了null
价值观。在运行查询之前,还需要设置sql_mode
至''
,因为它将删除更严格的NO_ZERO_DATE
sql模式。