У меня есть следующая схема таблицы;
CREATE TABLE `db1`.`sms_queue` (
`Id` INTEGER UNSIGNED NOT NULL AUTO_INCREMENT,
`Message` VARCHAR(160) NOT NULL DEFAULT 'Unknown Message Error',
`CurrentState` VARCHAR(10) NOT NULL DEFAULT 'None',
`Phone` VARCHAR(14) DEFAULT NULL,
`Created` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
`LastUpdated` TIMESTAMP NOT NULL ON UPDATE CURRENT_TIMESTAMP,
`TriesLeft` tinyint NOT NULL DEFAULT 3,
PRIMARY KEY (`Id`)
)
ENGINE = InnoDB;
Не удается выполнить следующую ошибку:
ERROR 1293 (HY000): Incorrect table definition; there can be only one TIMESTAMP column with CURRENT_TIMESTAMP in DEFAULT or ON UPDATE clause.
У меня вопрос, могу ли я иметь оба этих поля? или мне нужно вручную устанавливать поле LastUpdated во время каждой транзакции?
mysql
mysql-error-1293
Ксенф Ян
источник
источник
Ответы:
Из документации MySQL 5.5 :
Изменения в MySQL 5.6.5 :
источник
Changes in MySQL 5.6.5 (2012-04-10, Milestone 8) Previously, at most one TIMESTAMP column per table could be automatically initialized or updated to the current date and time. This restriction has been lifted. Any TIMESTAMP column definition can have any combination of DEFAULT CURRENT_TIMESTAMP and ON UPDATE CURRENT_TIMESTAMP clauses. In addition, these clauses now can be used with DATETIME column definitions. For more information, see Automatic Initialization and Updating for TIMESTAMP and DATETIME.
Есть уловка чтобы иметь обе отметки времени, но с небольшим ограничением.
В одной таблице можно использовать только одно из определений. Создайте оба столбца временных меток следующим образом:
Обратите внимание, что необходимо ввести
null
оба столбца во времяinsert
:источник
stamp_created
он также установлен как NOT NULL. MySQL автоматически заменит NULL текущей меткой времени.stamp_created
поле как:stamp_created timestamp default now()
вместо использования значения «НУЛЬ»?Вы можете получить их оба, просто снимите флаг «CURRENT_TIMESTAMP» в созданном поле. Всякий раз, когда вы создаете новую запись в таблице, просто используйте «СЕЙЧАС ()» для значения.
Или.
Напротив, удалите флаг «ON UPDATE CURRENT_TIMESTAMP» и отправьте NOW () для этого поля. В этом есть больше смысла.
источник
Если вы решили, что MySQL будет обрабатывать обновление временных меток, вы можете настроить триггер для обновления поля при вставке.
Ссылка на MySQL: http://dev.mysql.com/doc/refman/5.0/en/triggers.html
источник
Вот как можно получить автоматические и гибкие поля createDate / lastModified с помощью триггеров:
Сначала определите их так:
Затем добавьте эти триггеры:
Но вот что самое приятное:
источник
Начиная с MySQL 5.6, это просто ... попробуйте:
источник
Эта проблема, похоже, была решена в MySQL 5.6. Я заметил это до MySQL 5.5; вот пример кода:
Запуск этого в MySQL 5.5 дает:
Запуск в MySQL 5.6
источник
источник: http://gusiev.com/2009/04/update-and-create-timestamps-with-mysql/
источник
Для mysql 5.7.21 я использую следующее и отлично работает:
СОЗДАТЬ ТАБЛИЦУ
Posts
(modified_at
временная метка НЕ ПУЛЬТ ПО УМОЛЧАНИЮ CURRENT_TIMESTAMP ПРИ ОБНОВЛЕНИИ CURRENT_TIMESTAMP,created_at
временная метка НЕ ПУЛЬТ ПО УМОЛЧАНИЮ CURRENT_TIMESTAMP)источник
я думаю, что это лучший запрос для stamp_created и stamp_updated
потому что при создании записи
stamp_created
должен быть заполненnow()
иstamp_updated
должен быть заполнен'0000-00-00 00:00:00'
источник
Мой веб-хостинг застрял на mysql версии 5.1, поэтому любой, как я, не имеет возможности обновления, может следовать этим инструкциям:
http://joegornick.com/2009/12/30/mysql-created-and-modified-date-fields/
источник