Метка времени для создания строки и последней модификации

Мне нужно отслеживать время, когда строка была вставлена ​​в базу данных, и время, когда она последний раз изменялась.

Я попытался создать две отдельные колонки и использовать 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 ;

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

Другие вопросы по тегам