MySQL / 5. Работа с датами и временем

Регистрация времени последнего изменения строки

Задача
Вы хотели бы автоматически регистрировать время последнего изменения записи.

Решение
Включите в таблицу столбец TIMESTAMP.

Обсуждение
Чтобы создать таблицу, каждая строка которой содержала бы значение, указывающее время последнего обновления записи, включите в нее столбец TIMESTAMP. При создании новой строки столбец будет устанавливаться в текущую дату и время и будет обновляться при каждом изменении значения другого столбца строки. Предположим, что вы создаете таблицу tsdemo1 со столбцом TIMESTAMP:

CREATE TABLE tsdemo1
(
t TIMESTAMP,
val INT
);

Вставьте в таблицу две записи, а затем извлеките ее содержимое. (Выполните второе предложение INSERT через несколько секунд после первого, чтобы посмотреть, как отличаются временные метки.) В первом предложении INSERT показано, что вы можете установить столбец t в текущую дату и время, явно указав для него значение NULL; а во втором предложении t вообще не участвует в запросе:

mysql> INSERT INTO tsdemo1 (t,val) VALUES(NULL,5);
mysql> INSERT INTO tsdemo1 (val) VALUES(10);
mysql> SELECT * FROM tsdemo1;

+---------------------+----+
|               t              | val |
+---------------------+----+
| 20020715115825 |   5  |
| 20020715115831 |  10 |
+---------------------+----+

Теперь выдадим запрос, изменяющий значение столбца val, и проверим, как это отразится на содержимом таблицы:

mysql> UPDATE tsdemo1 SET val = 6 WHERE val = 5;mysql> SELECT * FROM tsdemo1;

+---------------------+----+
|                 t            | val |
+---------------------+----+
| 20020715115915 |   6  |
| 20020715115831 | 10  |
+---------------------+----+

Как видите, значение TIMESTAMP обновлено только для измененной записи. Если вы обновляете несколько записей, будут изменены все соответствующие значения TIMESTAMP:

mysql> UPDATE tsdemo1 SET val = val + 1;
mysql> SELECT * FROM tsdemo1;

+---------------------+----+
|              t               | val |
+---------------------+----+
| 20020715115926 |    7 |
| 20020715115926 |  11 |
+---------------------+----+

Если предложение UPDATE не изменяет значения столбца val, то и значения TIMESTAMP не изменяются. Давайте проверим это, установив каждую запись столбца val в его текущее значение:

mysql> UPDATE tsdemo1 SET val = val + 0;
mysql> SELECT * FROM tsdemo1;

+---------------------+-----+
|               t              | val |
+---------------------+-----+
| 20020715115926 |   7  |
| 20020715115926 | 11  |
+---------------------+-----+

Альтернативой TIMESTAMP является столбец типа DATETIME, явно устанавливаемый в NOW() при создании и изменении записей. Но в этом случае подобный алгоритм должен быть реализован во всех приложениях, использующих таблицу, иначе ничего не получится.

Статьи по MySQL на эту тему:

Вывод значений TIMESTAMP в удобном для чтения виде
Вычисления со значениями TIMESTAMP Задача
Регистрация времени создания записи

Вернуться в раздел: MySQL / 5. Работа с датами и временем