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
);

Демо в sqlfiddle

Ответ 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();

Подробнее см. в сообщении.