2016-04-27 14 views
20

quando ho provato a modificare la tabella il suo errore che mostraerrore 1067 (42000): valore di default non valido per 'created_at'

ERROR 1067 (42000): Invalid default value for 'created_at' 

i Google per questo errore, ma tutto quello che ho trovato è che se hanno cercato di alterare il timestamp questo errore è verificato ma qui sto cercando di aggiungere nuova colonna e sto ottenendo questo errore

mysql> ALTER TABLE investments ADD bank TEXT; 
ERROR 1067 (42000): Invalid default value for 'created_at' 

e la mia tabella ha ultime due colonne sono created_at e updated_at

ecco la mia tabella structur e

enter image description here

+0

quali sono i valori predefiniti per queste colonne? Puoi per favore condividere la struttura del tavolo? – Priyanshu

+0

@Priyanshu Ho aggiornato la mia struttura di tabella – iamsujit

+0

imposta il valore predefinito current_timestamp per le ultime due colonne. – Priyanshu

risposta

24

Il problema è a causa della sql_modes. Verifica le sql_modes attuali con il comando:

show variables like 'sql_mode' ; 

e rimuovere lo sql_mode "NO_ZERO_IN_DATE, NO_ZERO_DATE" per farlo funzionare.

Questa è la sql_mode predefinita nelle nuove versioni di mysql.

+2

Lo so, ma nel mio server sql_mode che mostra vuoto, ancora non funziona, sto usando [versione server: 5.5.53-0ubuntu0.12.04.1 - (Ubuntu)]. Qualcuno può avere qualsiasi soluzione senza aggiornare la versione del server? –

+0

hai controllato per comando globale? e non c'è nulla in sql_mode per la stessa sessione? –

+0

Ho controllato mostra variabili come 'sql_mode'; e l'output è Variable_name | Value = sql_mode | –

5

Cercare di eseguire il seguente comando:

ALTER TABLE `investments` 
MODIFY created_at TIMESTAMP 
DEFAULT CURRENT_TIMESTAMP 
NOT NULL; 

e

ALTER TABLE `investments` 
MODIFY updated_at TIMESTAMP 
DEFAULT CURRENT_TIMESTAMP 
NOT NULL; 

Il motivo che si stanno ottenendo questo errore è perché non si imposta un valore predefinito per la created_at e updated_at campi. MySQL non accetta il comando poiché i valori per queste colonne non possono essere nulli.

Spero che questo aiuti.

1

Si può fare in questo modo:

CREATE TABLE `ttt` (
    `id` INT(11) UNSIGNED NOT NULL AUTO_INCREMENT, 
    `t1` TIMESTAMP NULL DEFAULT '0000-00-00 00:00:00', 
    `t2` TIMESTAMP NULL DEFAULT '0000-00-00 00:00:00', 
    `t3` TIMESTAMP NULL DEFAULT '0000-00-00 00:00:00', 
    `t4` TIMESTAMP NULL DEFAULT 0, 
    PRIMARY KEY (`id`) 
) ENGINE=INNODB DEFAULT CHARSET=utf8; 
  • Poiché il valore timestamp viene memorizzato come epoca secondi, il valore timestamp '1970-01-01 00:00:00' (UTC) è riservata dal momento che il secondo # 0 viene utilizzato per rappresentare '0000-00-00 00:00:00'.
  • In MariaDB 5.5 e prima poteva esistere solo una colonna TIMESTAMP per tabella che aveva CURRENT_TIMESTAMP definito come valore predefinito. Questo limite non è più applicato da MariaDB 10.0.

vedi: https://mariadb.com/kb/en/mariadb/timestamp/

campione

MariaDB []> insert into ttt (id) VALUES (1),(2),(3); 
Query OK, 3 rows affected (0.01 sec) 
Records: 3 Duplicates: 0 Warnings: 0 

MariaDB []> select * from ttt; 
+----+---------------------+---------------------+---------------------+---------------------+ 
| id | t1     | t2     | t3     | t4     | 
+----+---------------------+---------------------+---------------------+---------------------+ 
| 1 | 0000-00-00 00:00:00 | 2000-01-01 12:01:02 | 0000-00-00 00:00:00 | 0000-00-00 00:00:00 | 
| 2 | 0000-00-00 00:00:00 | 2000-01-01 12:01:02 | 0000-00-00 00:00:00 | 0000-00-00 00:00:00 | 
| 3 | 0000-00-00 00:00:00 | 2000-01-01 12:01:02 | 0000-00-00 00:00:00 | 0000-00-00 00:00:00 | 
+----+---------------------+---------------------+---------------------+---------------------+ 
3 rows in set (0.00 sec) 

MariaDB []> 
23

Semplicemente, prima di eseguire qualsiasi istruzione mettere questo nella prima riga:

SET sql_mode = ''; 
2

Ho avuto problemi simili.In seguito risolto:

Cambio:

recollect_date TIMESTAMP DEFAULT 'CURRENT_TIMESTAMP',

a:

recollect_date TIMESTAMP DEFAULT CURRENT_TIMESTAMP,

cioè è sufficiente rimuovere le virgolette attorno CURRENT_TIMESTAMP.

Spero che questo aiuti qualcuno.

3

Nel mio caso, ho un file da importare. Quindi ho semplicemente aggiunto SET sql_mode = ''; all'inizio del file e funziona!

1

Ho trovato lo stesso errore durante il tentativo di installare un database di terze parti. Ho provato la soluzione proposta, senza successo, vale a dire
SET sql_mode = '';

Poi ho provato il seguente comando, che ha funzionato consentendo il database da installare
SET GLOBAL sql_mode = '';

0

eseguita questa interrogazione:

SET SQL_MODE = "NO_AUTO_VALUE_ON_ZERO"; 
SET time_zone = "+00:00"; 

funziona per me

Problemi correlati