Неможливо встановити дату 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.


Проблема пов'язана з додаванням мікросекунд у значення за замовчуванням у нових версіях 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 на таблицю.


8

Перевірте цю відповідь .

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

  • Оновлення до MySQL 5.6.5
  • Змініть тип стовпця на TIMESTAMP, як у:

    ALTER TABLE `downloads` ADD `date` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ;
  • Створіть TRIGGER, який автоматично оновлює стовпець:

    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)
    
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.