Подтвердить что ты не робот

MySQL CURRENT_TIMESTAMP для создания и обновления

Я хочу определить таблицу, которая будет иметь 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 в схеме таблицы.

4b9b3361

Ответ 1

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

Ответ 2

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

Ответ 3

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

Ответ 4

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

Ответ 5

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

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

Ответ 6

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

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

Ответ 7

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

Ответ 8

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