Não é possível usar a data padrão para CURRENT_TIMESTAMP no MySQL 5.5

18

Não consigo definir Current_timestampcomo valor padrão. Minha Mysqlversão é 5.5.47.

Consulta é

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

insira a descrição da imagem aqui

Enquanto ele está funcionando bem no meu banco de dados local com mysql V5.6.56.

urfusão
fonte
O problema é devido aos microssegundos adicionados no valor padrão nas novas versões do mysql. Veja tekina.info/… para soluções.
Aniket Singh

Respostas:

25

No manual do MySQL 5.5 :

Você não pode definir o padrão para uma coluna de data como o valor de uma função como NOW () ou CURRENT_DATE. A exceção é que você pode especificar CURRENT_TIMESTAMP como o padrão para uma coluna TIMESTAMP.

Portanto, o que você deseja alcançar funcionará no MySQL 5.5 se você adicionar uma TIMESTAMPcoluna em vez de uma DATEcoluna.

As alterações na 5.6.x que permitem a funcionalidade estão documentadas aqui , e citarei o resumo relevante para fins de integridade:

No MySQL 5.6.5, as colunas TIMESTAMP e DATETIME podem ser inicializadas e atualizadas automaticamente para a data e hora atuais (ou seja, o carimbo de data / hora atual). Antes da versão 5.6.5, isso ocorre apenas para TIMESTAMP e para no máximo uma coluna TIMESTAMP por tabela.

Philᵀᴹ
fonte
8

Verifique esta resposta .

Suas opções são:

  • Atualize para o MySQL 5.6.5
  • Altere o tipo de coluna para TIMESTAMP, como em:

    ALTER TABLE `downloads` ADD `date` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ;
  • Crie um gatilho que atualize a coluna automaticamente:

    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 ;

    Você também pode criar um valor de atualização, se precisar ser atualizado automaticamente na atualização ou desejar impedir 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
fonte