MySQL CURRENT_TIMESTAMP как ПО УМОЛЧАНИЮ
При создании таблицы я получаю следующую ошибку:
ERROR 1293 (HY000): Incorrect table definition; there can be only one TIMESTAMP column with CURRENT_TIMESTAMP in DEFAULT or ON UPDATE clause
Проблема заключается в том, что по умолчанию у меня фактически нет двух столбцов TIMESTAMP
с CURRENT_TIMESTAMP
, и я не использую предложение ON UPDATE
.
Запрос DDL, который я пытаюсь выполнить,
CREATE TABLE user(
/* Basic Information */
id INT NOT NULL AUTO_INCREMENT,
firstname VARCHAR(255) NOT NULL,
surname VARCHAR(255) NOT NULL,
email VARCHAR(255) NOT NULL UNIQUE,
username VARCHAR(255) NOT NULL UNIQUE,
password CHAR(40) NOT NULL,
/* System status information */
active BOOL NOT NULL DEFAULT FALSE,
validated BOOL NOT NULL DEFAULT FALSE,
date_validated TIMESTAMP,
date_registered TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
/* Index */
PRIMARY KEY (id)
) Engine=InnoDB;
Что вызывает проблему?
Ответы
Ответ 1
Вы можете использовать две метки времени в одной таблице. Для по умолчанию сначала используйте поле DEFAULT, а затем остальные временные метки.
Ниже запрос должен работать.
CREATE TABLE myTable
(
id INT,
date_registered TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
date_validated TIMESTAMP
);
Ответ 2
Я думаю, важно отметить, что это ограничение больше не присутствует в MySQL 5.6.5. Ограничение было удалено и добавлены некоторые дополнительные функции. В частности: несколько полей TIMESTAMP, а также поля DATETIME могут иметь автоматическое значение по умолчанию, которое устанавливает поле в текущую временную метку/дату-время, как описано в следующем сообщении в блоге (очевидно, написанном человеком, который сделал исправление): http://optimize-this.blogspot.com/2012/04/datetime-default-now-finally-available.html
Дополнительные особенности
Кроме того, может быть полезно ознакомиться с тем, как создавать значения даты и времени по умолчанию.
Как указано в приведенной ниже ссылке, вы можете установить типы данных DATETIME и TIMESTAMP, чтобы столбец имел значение DEFAULT текущей даты и времени операции INSERT для данной строки.
В качестве альтернативы вы можете установить для них ON UPDATE текущую дату и время, установленные в поле в операции UPDATE.
Ссылка:
http://dev.mysql.com/doc/refman/5.7/en/timestamp-initialization.html
Вот то, что оба будут выглядеть в инструкции CREATE TABLE:
CREATE TABLE t1 (
ts1 TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
,ts2 TIMESTAMP DEFAULT NOW()
);
Стоит отметить, что CURRENT_TIMESTAMP является псевдонимом NOW().
Кроме того, установка поля TIMESTAMP или DATETIME в NULL приведет к изменению столбцов DEFAULT в значение null вместо значения времени даты (снова см. Ссылку для уточнения и более подробную информацию).
Другим потенциально ценным моментом является то, что DATETIME может содержать диапазон дат от:
1000-01-01 до 9999-12-31, в то время как TIMESTAMP имеет диапазон:
1970-01-01 00:00: 01 до 2038-01-19 03:14:07
Для дополнительных сравнений между DATETIME и TIMESTAMP читайте эту страницу руководства MySQL, сравнивая их.
Ответ 3
Позвольте мне процитировать мое собственное сообщение в блоге: "По какой-то причине MySQL позволяет только одно автоматическое обновление метки времени для каждой таблицы. несколько способов обойти это, но не все способы не сосут".
Я рекомендую использовать триггер для каждой отметки времени:
CREATE TRIGGER customer_create BEFORE INSERT ON `customer`
FOR EACH ROW SET NEW.created_at = NOW(), NEW.updated_at = NOW();
Подробнее см. в сообщении.