Предупреждение вне столбца значений диапазона для условного обновления - PullRequest
0 голосов
/ 12 декабря 2018

У меня есть один запрос на обновление таблицы, и некоторые поля должны быть обновлены в соответствии с условиями, давайте представим себе такой случай:

У меня есть таблица с именем mytable , она имеет DATETIME поле с именем установлено , это поле может иметь значение NULL и по умолчанию равно NULL, а иногда некоторые значения имеют значение «0000-00-00 00:00:00».

Когда я получаю данныеот любого датчика (пример: идентификатор датчика 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)?


Ответ Мадхур Бхайя :

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 Ответ

0 голосов
/ 12 декабря 2018

У вас есть 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...