Метка времени для создания строки и последней модификации
Мне нужно отслеживать время, когда строка была вставлена в базу данных, и время, когда она последний раз изменялась.
Я попытался создать две отдельные колонки и использовать CURRENT_TIMESTAMP
:
create table def (
id int,
creation timestamp
default CURRENT_TIMESTAMP,
modification timestamp
on update CURRENT_TIMESTAMP
);
Однако это привело к ошибке:
ОШИБКА 1293 (HY000): неверное определение таблицы; может быть только один столбец TIMESTAMP с CURRENT_TIMESTAMP в предложении DEFAULT или ON UPDATE
Каков наилучший способ сделать это?
Я думаю о хранимой процедуре, но ищу стандартное решение. Я также обеспокоен привилегиями доступа - как можно меньше программ / вещей могут касаться отметок времени.
Хотя я предпочел бы ответы MySQL, решения для других СУБД также приветствуются!
2 ответа
Да, это слабое ограничение для MySQL. Если вы просматриваете приложение, вы можете добавить вызов time() для столбца create_at и позволить столбцу updated_at использовать CURRENT_TIMESTAMP.
$sql = "INSERT INTO my_table SET name = 'Mike', created_at = " . time();
Я бы предпочел сделать это для столбца create_at, так как он, вероятно, не будет затронут так часто, как столбец updated_at.
-- Редактировать --
Еще лучше использовать встроенный MySQL now()
функция. Таким образом, вам нужно заботиться только о часовом поясе сервера mysql, а не о часовых поясах сервера приложений и сервера mysql.
$sql = "INSERT INTO my_table SET name = 'Mike', created_at = NOW()";
Вы можете использовать триггер. Приложение также может установить значение, но если это так, оно будет перезаписано базой данных.
delimiter //
CREATE TRIGGER def_bef_update BEFORE UPDATE ON def FOR EACH ROW BEGIN
SET NEW.modification = CURRENT_TIMESTAMP;
END//
delimiter ;
Вы также можете использовать его для проверки данных и обновления даты вашего изменения, только если есть важные изменения.