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

标签 mysql sql-update

我有一个查询来更新表,并且一些字段应该在条件下更新,让我们想象一下这种情况:

我有一个名为mytable的表,它有一个名为installedDATETIME字段,该字段可以为空,并且默认为空,有时某些值为“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/

相关文章:

java - 生成唯一的客户 ID/在配置单元中插入唯一的行

php - 通过json在数据库中插入行不起作用

Mysql 5.5 查询优化

MySQL - 使用 CASE 和 ELSE 进行更新

sql - SQL 更新未抛出错误

MySQL:如果值仅为数字则更新列

MySql 数据库一夜之间发生变化

php - mysql 选择按日期和时间排序 str_to_date

c# - Dapper Execute 函数可以调用 PostgreSQL 函数并返回受更新或插入影响的行

mysql - 使用另一个表中的数据更新