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

18

Je ne peux pas définir Current_timestampcomme valeur par défaut. Ma Mysqlversion est 5.5.47.

La requête est

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

entrez la description de l'image ici

Alors que cela fonctionne bien sur ma base de données locale avec mysql V5.6.56.

urfusion
la source
Le problème est dû aux microsecondes ajoutées dans la valeur par défaut dans les nouvelles versions de mysql. Voir tekina.info/… pour les solutions.
Aniket Singh

Réponses:

25

Dans 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 TIMESTAMPcolonne au lieu d'une DATEcolonne.

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.

Philᵀᴹ
la source
8

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)
    
jynus
la source