Задача
Вы хотите сохранить время создания записи, что можно было бы сделать при помощи 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 оставался неизменным.