Текущее время MySQL на создание и обновление

Я хочу определить таблицу, которая будет иметь 2 поля метки времени, что-то вроде этого:

CREATE TABLE `msgs` (
    `id` INT PRIMARY KEY AUTO_INCREMENT,
    `msg` VARCHAR(256),
    `ts_create` TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    `ts_update` TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
)

как это сделать, избегая ошибки:

ERROR 1293 (HY000): Incorrect table definition; there can be only one TIMESTAMP column with CURRENT_TIMESTAMP in DEFAULT or ON UPDATE clause

сохранять желаемого поведения ts_create и ts_update в таблице схемы.

9 ответов


Это ограничение mySQL, вы не может есть два столбца типа timestamp по умолчанию, которые ссылаются на ТЕКУЩАЯ_ОТМЕТКА_ВРЕМЕНИ. Единственный способ сделать это-использовать тип DATETIME для ts_create, который, к сожалению, не может иметь значение по умолчанию NOW(). Вы можете запустить свой собственный триггер, чтобы это произошло.


думаю, это старый пост, но на самом деле я думаю, что mysql поддерживает 2 TIMESTAMP в своих последних выпусках mysql 5.6.25, вот что я использую сейчас.


вы используете более старую версию MySql. Обновите myqsl до 5.6.5+ он будет работать.


вы не можете иметь два столбца TIMESTAMP с тем же значением по умолчанию CURRENT_TIMESTAMP в вашей таблице. Пожалуйста, обратитесь к этой ссылке: http://www.mysqltutorial.org/mysql-timestamp.aspx


Я думаю, что это возможно, используя ниже технику

`ts_create` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00',
`ts_update` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP

Я думаю, вы, возможно, хотите ts_create как datetime (так переименовать -> dt_create) и только ts_update как метку времени? Это гарантирует, что он останется неизменным после установки.

Я понимаю, что datetime предназначен для значений, управляемых вручную, и временная метка немного "особенная" в том, что MySQL будет поддерживать ее для вас. В этом случае datetime является хорошим выбором для ts_create.


Я бы сказал, что вам не нужно иметь по умолчанию CURRENT_TIMESTAMP на вашем ts_update: если он пуст, то он не обновляется, поэтому ваше "последнее обновление" - это ts_create.


Это крошечное ограничение Mysql в более старой версии, на самом деле после версии 5.6 и позже работает несколько временных меток...


вы можете попробовать это ts_create ОТМЕТКА ВРЕМЕНИ ПО УМОЛЧАНИЮ CURRENT_TIMESTAMP, ts_update ТИПА TIMESTAMP ПО УМОЛЧАНИЮ NULL НА ТЕКУЩАЯ_ОТМЕТКА_ВРЕМЕНИ ОБНОВЛЕНИЕ