Задача
Вы хотели бы автоматически регистрировать время последнего изменения записи.
Решение
Включите в таблицу столбец 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() при создании и изменении записей. Но в этом случае подобный алгоритм должен быть реализован во всех приложениях, использующих таблицу, иначе ничего не получится.