web-dev-qa-db-fra.com

La date par défaut ne peut pas être CURRENT_TIMESTAMP dans MySQL 5.5

Je ne parviens pas à définir Current_timestamp comme valeur par défaut. Ma Mysql version est 5.5.47.

La requête est

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

enter image description here

Pendant qu'il fonctionne bien sur ma base de données locale avec mysql V5.6.56.

21
urfusion

Depuis le manuel MySQL 5.5 :

Vous ne pouvez pas définir la valeur par défaut pour une colonne de date comme étant la valeur d'une fonction telle que NOW () ou CURRENT_DATE. L'exception est que vous pouvez spécifier CURRENT_TIMESTAMP comme valeur par défaut pour une colonne TIMESTAMP.

Par conséquent, ce que vous voulez réaliser fonctionnera dans MySQL 5.5 si vous ajoutez une colonne TIMESTAMP au lieu d'une colonne DATE.

Les changements dans 5.6.x qui permettent la fonctionnalité sont documentés ici , et je citerai le résumé pertinent pour être complet:

Depuis MySQL 5.6.5, les colonnes TIMESTAMP et DATETIME peuvent être automatiquement initialisées et mises à jour à la date et à l'heure actuelles (c'est-à-dire l'horodatage actuel). Avant la version 5.6.5, cela n'est vrai que pour TIMESTAMP et pour au plus une colonne TIMESTAMP par table.

26
Philᵀᴹ

Vérifiez cette réponse .

Vos options sont:

  • Mettre à niveau vers MySQL 5.6.5
  • Changez le type de colonne en TIMESTAMP, comme dans:

    ALTER TABLE `downloads` ADD `date` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ;
    
  • Créez un TRIGGER QUI met à jour la colonne automatiquement:

    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 ;
    

    Vous pouvez également créer une valeur de mise à jour si elle doit être mise à jour automatiquement lors de la mise à jour ou si vous souhaitez empêcher les valeurs nulles.

    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)
    
9
jynus