Nie można ustawić domyślnej daty na CURRENT_TIMESTAMP w MySQL 5.5

18

Nie mogę ustawić Current_timestampwartości domyślnej. Moja Mysqlwersja to 5.5.47.

Zapytanie jest

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

wprowadź opis zdjęcia tutaj

Podczas gdy działa dobrze na moim lokalnym DB z mysql V5.6.56.

urfuzja
źródło
Problem wynika z dodania wartości domyślnych mikrosekund w nowych wersjach mysql. Zobacz tekina.info/... rozwiązań.
Aniket Singh,

Odpowiedzi:

25

Z podręcznika MySQL 5.5 :

Nie można ustawić wartości domyślnej dla kolumny daty na wartość funkcji, takiej jak NOW () lub CURRENT_DATE. Wyjątkiem jest to, że możesz określić CURRENT_TIMESTAMP jako domyślny dla kolumny TIMESTAMP.

Dlatego to, co chcesz osiągnąć, zadziała w MySQL 5.5, jeśli dodasz TIMESTAMPkolumnę zamiast DATEkolumny.

Zmiany w 5.6.x, które pozwalają na funkcjonalność, są tutaj udokumentowane , a dla kompletności podam odpowiednie podsumowanie:

Począwszy od MySQL 5.6.5, kolumny TIMESTAMP i DATETIME mogą być automatycznie inicjowane i aktualizowane do bieżącej daty i godziny (tj. Bieżącego znacznika czasu). Przed 5.6.5 dotyczy to tylko TIMESTAMP i co najwyżej jednej kolumny TIMESTAMP na tabelę.

Philᵀᴹ
źródło
8

Sprawdź tę odpowiedź .

Twoje opcje to:

  • Uaktualnij do MySQL 5.6.5
  • Zmień typ kolumny na TIMESTAMP, jak w:

    ALTER TABLE `downloads` ADD `date` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ;
  • Utwórz SPUST, który automatycznie aktualizuje kolumnę:

    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 ;
    

    Możesz także utworzyć wartość aktualizacji, jeśli musi ona być automatycznie aktualizowana podczas aktualizacji lub chcesz zapobiec wartościom pustym.

    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
źródło