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

Задача
Вы хотите сохранить время создания записи, что можно было бы сделать при помощи TIMESTAMP, но вам нужно, чтобы это значение не менялось при изменении записи, а тип TIMESTAMP не умеет хранить значение.

Решение
На самом деле он все умеет, нужно только включить в таблицу второй столбец TIMESTAMP, имеющий другие свойства.

Обсуждение
Если вам нужен столбец, который бы изначально устанавливался в момент создания записи, а затем больше не менялся, один TIMESTAMP – это не решение, так как он обновляется при изменении других столбцов записи. Создадим два столбца TIMESTAMP и воспользуемся тем, что второй не обладает специальными свойствами первого. Оба столбца можно установить в текущую дату и время в момент создания записи. Далее при каждом изменении других столбцов записи первый столбец TIMESTAMP будет обновляться, а второй будет продолжать хранить время создания записи. Рассмотрим такую таблицу:

CREATE TABLE tsdemo2
(
t_update TIMESTAMP, # время последнего изменения записи
t_create TIMESTAMP, # время создания записи
val INT
);

Создадим таблицу, затем вставим в нее запись, в которой оба столбца TIMESTAMP установлены в NULL (чтобы инициализировать их в текущую дату и время):

mysql> INSERT INTO tsdemo2 (t_update,t_create,val) VALUES(NULL,NULL,5);
mysql> SELECT * FROM tsdemo2;

+---------------------+---------------------+----+
| t_update | t_create | val |
+---------------------+---------------------+----+
| 20020715120003 | 20020715120003 | 5 |
+---------------------+---------------------+----+

После добавления записи изменим столбец val, затем проверим, произошло ли обновление столбца t_update и остался ли неизменным и равным времени создания записи столбец t_create:

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

+---------------------+---------------------+----+
| t_update | t_create | val |
+---------------------+---------------------+----+
| 20020715120012 | 20020715120003 | 6 |
+---------------------+---------------------+----+

Как и в случае с tsdemo1, обновления таблицы tsdemo2, которые в действительности не изменяют значения столбца, не вызывают изменения значений TIMESTAMP:

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

+----------------------+---------------------+----+
| t_update | t_create | val |
+---------------------+----------------------+----+
| 20020715120012 | 20020715120003 | 6 |
+---------------------+----------------------+----+

Можно было использовать для столбцов t_create и t_update и тип DATETIME.


При создании записи их оба нужно было бы явно установить в NOW(). При изменении записи t_update устанавливался бы в NOW(), а t_create оставался неизменным..



Оцените статью: (0 голосов)
0 5 0

Статьи из раздела MySQL на эту тему:
Выбор записей по временным характеристикам
Вывод значений TIMESTAMP в удобном для чтения виде
Вычисление возраста
Вычисление длины месяца
Вычисление интервалов между значениями времени

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