Странное поведение при обновлении столбца метки времени - PullRequest
3 голосов
/ 01 октября 2019

Существует таблица MariaDB-10.3.18 в виде:

create table switching_log
(
    item_name varchar(20) NOT NULL,
    switched_off timestamp,
    switched_on timestamp
);

select * from switching_log;
+-----------+---------------------+---------------------+
| item_name | switched_off        | switched_on         |
+-----------+---------------------+---------------------+
| 201197010 | 2019-10-01 08:36:08 | 2019-10-01 08:35:49 |
+-----------+---------------------+---------------------+

Когда я обновляю «Switched_off», то «Switched_on» не изменяется

UPDATE switching_log set switched_off = now()   where item_name = '201197010';

select * from switching_log;
+-----------+---------------------+---------------------+
| item_name | switched_off        | switched_on         |
+-----------+---------------------+---------------------+
| 201197010 | 2019-10-01 08:40:28 | 2019-10-01 08:35:49 |
+-----------+---------------------+---------------------+

Но когда я обновляю «Swit_on»'then' Switched_off 'также обновлен.

UPDATE switching_log set switched_on = now()   where item_name = '201197010';

select * from switching_log;
+-----------+---------------------+---------------------+
| item_name | switched_off        | switched_on         |
+-----------+---------------------+---------------------+
| 201197010 | 2019-10-01 08:40:40 | 2019-10-01 08:40:40 |
+-----------+---------------------+---------------------+

1 Ответ

3 голосов
/ 01 октября 2019

Это поведение является заданным :

MariaDB имеет специальное поведение для первого столбца, который использует тип данных TIMESTAMP в определенной таблице. Для первого столбца, который использует тип данных TIMESTAMP в конкретной таблице, MariaDB автоматически присваивает столбцу следующие свойства:

DEFAULT CURRENT_TIMESTAMP
ON UPDATE CURRENT_TIMESTAMP 

Это означает, что если столбцу явно не присвоено значение в INSERT илиПо запросу UPDATE, затем MariaDB автоматически инициализирует значение столбца с текущей датой и временем.

Чтобы решить эту проблему, отключите функцию «автоматических значений» для столбцов отметок времени. Самый простой и предсказуемый подход:

create table switching_log
(
    item_name varchar(20) NOT NULL,
    switched_off timestamp NULL,
    switched_on timestamp NULL
);

Демонстрация на db <> fiddle

...