警告超出范围值列以进行条件更新

时间:2018-12-12 13:16:10

标签: mysql sql-update

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

我有一个名为 mytable 的表,它有一个名为 installed class Contractor < ApplicationRecord belongs_to :user has_many :workgroup_libraries has_many :construction_projects, dependent: :destroy has_many :clients, dependent: :destroy has_many :documents, through: :construction_projects, dependent: :destroy has_many :resources has_many :resource_quantities, through: :resources has_many :workgroups mount_uploader :logo, LogoUploader end 字段,此字段可以为null,默认情况下为null,有时值是“ 0000-00-00 00:00:00”。

当我从任何传感器获取数据时(例如:传感器ID 12457),我会像这样更新其值:

DATETIME

如果我从同一传感器获取新数据,则会再次存储其值,但避免以这种方式更改安装值:

UPDATE mytable SET
temperature=35,
pressure=122,
installed=NOW(),
status=1
WHERE id=12457

它按预期工作,如果安装为null,它将存储当前时间,如果不是,它将保留以前的日期,但是当日期为'0000-00-00 00:00:00'时,我会收到此警告:< / p>

警告:第1行“已安装”列的值超出范围

按照 D-Shih 的建议,我尝试使用COALESCE进行以下操作,但是我得到了相同的警告:

UPDATE mytable SET
temperature=35,
pressure=122,
installed=IF(installed IS NULL,NOW(),installed),
status=1
WHERE id=12457

我以为是因为以前的日期,所以,我试图重做此错误:

installed=COALESCE(installed,NOW())

但是我没有得到任何警告。

系统工作正常,但我有点好奇,为什么我仅使用IF(或COALESCE)功能得到此警告?


回答 Madhur Bhaiya

UPDATE mytable SET installed=installed, WHERE id=12457

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`)
)

MySQL版本:5.7.23

1 个答案:

答案 0 :(得分:1)

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