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
в схеме таблицы.
Ответы
Ответ 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, а затем несколько временных меток работают...