我只有一个查询来更新表,并且某些字段应在一定条件下进行更新,让我们想象这种情况:
我有一个名为 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
答案 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