MySQL CURRENT_TIMESTAMP при создании и обновлении - PullRequest
62 голосов
/ 04 февраля 2011

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

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 ]

55 голосов
/ 04 февраля 2011

Это ограничение mySQL, вы не можете иметь два столбца TIMESTAMP со значениями по умолчанию, которые ссылаются на CURRENT_TIMESTAMP.Единственный способ сделать это - использовать тип DATETIME для ts_create, который, к сожалению, не может иметь значение по умолчанию NOW ().Вы можете запустить свой собственный триггер, чтобы это произошло.

13 голосов
/ 16 февраля 2016

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

5 голосов
/ 28 апреля 2015

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

2 голосов
/ 05 марта 2015

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

`ts_create` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00',
`ts_update` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
1 голос
/ 30 сентября 2014

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

0 голосов
/ 24 января 2018

вы можете попробовать это ts_create TIMESTAMP DEFAULT CURRENT_TIMESTAMP, ts_update TIMESTAMP DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP

0 голосов
/ 12 октября 2017

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

0 голосов
/ 04 февраля 2011

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

0 голосов
/ 04 февраля 2011

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

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

...