La fecha predeterminada no puede ser CURRENT_TIMESTAMP en MySQL 5.5

18

No puedo establecer Current_timestampcomo valor predeterminado. Mi Mysqlversión es 5.5.47.

La consulta es

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

ingrese la descripción de la imagen aquí

Si bien funciona bien en mi base de datos local con mysql V5.6.56.

urfusion
fuente
El problema se debe a los microsegundos agregados en el valor predeterminado en las nuevas versiones de mysql. Ver tekina.info/… para soluciones.
Aniket Singh

Respuestas:

25

Del manual de MySQL 5.5 :

No puede establecer el valor predeterminado para una columna de fecha para que sea el valor de una función como NOW () o CURRENT_DATE. La excepción es que puede especificar CURRENT_TIMESTAMP como el valor predeterminado para una columna TIMESTAMP.

Por lo tanto, lo que desea lograr funcionará en MySQL 5.5 si agrega una TIMESTAMPcolumna en lugar de una DATEcolumna.

Los cambios en 5.6.x que permiten la funcionalidad se documentan aquí , y citaré el resumen relevante para completar:

A partir de MySQL 5.6.5, las columnas TIMESTAMP y DATETIME se pueden inicializar y actualizar automáticamente a la fecha y hora actuales (es decir, la marca de tiempo actual). Antes de 5.6.5, esto es cierto solo para TIMESTAMP y, como máximo, una columna TIMESTAMP por tabla.

Philᵀᴹ
fuente
8

Mira esta respuesta .

Sus opciones son:

  • Actualizar a MySQL 5.6.5
  • Cambie el tipo de columna a TIMESTAMP, como en:

    ALTER TABLE `downloads` ADD `date` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ;
  • Cree un GATILLO QUE actualice la columna automáticamente:

    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 ;

    Es posible que también desee crear un valor de actualización, si debe actualizarse automáticamente en la actualización o si desea evitar valores nulos.

    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
fuente