Не удается установить дату по умолчанию для CURRENT_TIMESTAMP в MySQL 5.5

18

Я не могу установить Current_timestampзначение по умолчанию. Моя Mysqlверсия 5.5.47.

Запрос

ALTER TABLE `downloads` ADD `date` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ;

введите описание изображения здесь

Пока он работает нормально на моей локальной БД с mysql V5.6.56.

urfusion
источник
Проблема связана с микросекундами, добавленными в значение по умолчанию в новых версиях MySQL. Смотрите tekina.info/… для решения.
Аникет Сингх

Ответы:

25

Из руководства по MySQL 5.5 :

Вы не можете установить по умолчанию для столбца даты значение функции, такой как NOW () или CURRENT_DATE. Исключением является то, что вы можете указать CURRENT_TIMESTAMP в качестве значения по умолчанию для столбца TIMESTAMP.

Следовательно, то, чего вы хотите достичь, будет работать в MySQL 5.5, если вы добавите TIMESTAMPстолбец вместо DATEстолбца.

Изменения в 5.6.x, которые обеспечивают функциональность, описаны здесь , и я приведу соответствующее резюме для полноты:

Начиная с MySQL 5.6.5, столбцы TIMESTAMP и DATETIME могут автоматически инициализироваться и обновляться до текущей даты и времени (то есть текущей отметки времени). До 5.6.5 это верно только для TIMESTAMP и не более одного столбца TIMESTAMP на таблицу.

Philᵀᴹ
источник
8

Проверьте этот ответ .

Ваши варианты:

  • Обновление до MySQL 5.6.5
  • Измените тип столбца на TIMESTAMP, как в:

    ALTER TABLE `downloads` ADD `date` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ;
  • Создайте ТРИГГЕР, который автоматически обновляет столбец:

    ALTER TABLE `downloads` ADD `date` DATETIME NULL; -- date must allow
                                                      -- NULLs or default
                                                      -- to a special value
    DROP TRIGGER IF EXISTS downloads_BI;
    DELIMITER //
    CREATE TRIGGER downloads_BI
    BEFORE INSERT ON downloads FOR EACH ROW
    BEGIN
        IF (NEW.date IS NULL) THEN -- change the isnull check for the default used
            SET NEW.date = now();
        END IF;
    END//
    DELIMITER ;

    Вы также можете создать значение обновления, если оно должно автоматически обновляться при обновлении или хотите запретить нулевые значения.

    mysql> INSERT INTO downloads (i) VALUES (1); -- I do not set date
    Query OK, 1 row affected (0.00 sec)
    
    mysql> SELECT * FROM downloads;
    +------+---------------------+
    | i    | date                |
    +------+---------------------+
    |    1 | 2016-03-22 09:27:52 |
    +------+---------------------+
    1 row in set (0.00 sec)
jynus
источник