Impossibile impostare la data predefinita su CURRENT_TIMESTAMP in MySQL 5.5


18

Non riesco a impostare Current_timestampcome valore predefinito. La mia Mysqlversione è 5.5.47.

La query è

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

inserisci qui la descrizione dell'immagine

Mentre funziona bene sul mio DB locale con mysql V5.6.56.


Il problema è dovuto ai microsecondi aggiunti nel valore predefinito nelle nuove versioni di mysql. Vedi tekina.info/… per soluzioni.
Aniket Singh

Risposte:


25

Dal manuale di MySQL 5.5 :

Non è possibile impostare il valore predefinito per una colonna della data come valore di una funzione come NOW () o CURRENT_DATE. L'eccezione è che è possibile specificare CURRENT_TIMESTAMP come predefinito per una colonna TIMESTAMP.

Pertanto, ciò che si desidera ottenere funzionerà in MySQL 5.5 se si aggiunge una TIMESTAMPcolonna anziché una DATEcolonna.

Le modifiche in 5.6.x che consentono la funzionalità sono documentate qui e citerò il relativo sommario per completezza:

A partire da MySQL 5.6.5, le colonne TIMESTAMP e DATETIME possono essere inizializzate e aggiornate automaticamente alla data e ora correnti (ovvero, il timestamp corrente). Prima della 5.6.5, questo vale solo per TIMESTAMP e per al massimo una colonna TIMESTAMP per tabella.


8

Controlla questa risposta .

Le tue opzioni sono:

  • Aggiorna a MySQL 5.6.5
  • Cambia il tipo di colonna in TIMESTAMP, come in:

    ALTER TABLE `downloads` ADD `date` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ;
  • Crea un TRIGGER che aggiorna automaticamente la colonna:

    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 ;

    È possibile che si desideri creare anche un valore di aggiornamento, se deve essere aggiornato automaticamente all'aggiornamento o se si desidera impedire valori null.

    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)
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.