ERRORE 1067 (42000): valore predefinito non valido per "created_at"


102

Quando ho provato a modificare la tabella ha mostrato l'errore:

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

Ho cercato su Google questo errore, ma tutto ciò che ho trovato è stato come se avessero cercato di modificare il timestamp in modo che si fosse verificato. Tuttavia qui sto cercando di aggiungere una nuova colonna e ricevo questo errore:

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

e le ultime due colonne della mia tabella sono created_ate updated_at.

Ecco la struttura della mia tabella:

inserisci qui la descrizione dell'immagine


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

@Priyanshu ho aggiornato la struttura del mio tavolo
iamsujit

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

Risposte:


144

Il problema è a causa di sql_modes . Controlla i tuoi attuali sql_modes tramite comando:

show variables like 'sql_mode' ; 

E rimuovi sql_mode " NO_ZERO_IN_DATE, NO_ZERO_DATE " per farlo funzionare. Questo è il sql_mode predefinito nelle nuove versioni di mysql.

Puoi impostare sql_mode globalmente come root tramite comando:

set global sql_mode = 'ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION';

7
Lo so, ma nel mio server sql_mode risulta 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?
Priyabrata Atha

hai controllato tramite comando globale? e non c'è niente in sql_mode per la stessa sessione?
Aman Aggarwal

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

2
Ciò sarà utile per questa risposta stackoverflow.com/questions/2317650/...
Preshan Pradeepa

4
Non ha funzionato per me con 5.7. Non sono sicuro se dovessi farlo a livello globale o meno.
Brett

96

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

SET sql_mode = '';

è stato semplicemente fantastico. Grazie amico!
Novasol

7
Grazie per il consiglio. Ma solo la rimozione delle restrizioni sulla data NO_ZERO_IN_DATE,NO_ZERO_DATEci consente di mantenere altre funzionalità di sicurezza:SET sql_mode = 'ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION';
KeitelDOG

1
Per chiarimenti, questa affermazione dovrebbe essere usata solo nello sviluppo, non nella produzione.
Ahmed Mohamed

Semplice e diretto al punto.
Frank Fotangs

28

Ho riscontrato lo stesso errore durante il tentativo di installare un database di terze parti. Ho provato la soluzione proposta senza successo cioè
SET sql_mode = '';

Quindi ho provato il comando sottostante che ha funzionato consentendo l'installazione del database
SET GLOBAL sql_mode = '';


1
SET sql_mode = '';è ora deprecato, SET GLOBAL sql_mode = ''è OK
Vadim Anisimov

26

Prova ad 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 per cui ricevi questo errore è perché non stai impostando un valore predefinito per i campi created_ate updated_at. MySQL non accetta il tuo comando poiché i valori per queste colonne non possono essere nulli.

Spero che sia di aiuto.


2
Grazie, voto positivo, preferisco questa soluzione nel mio caso d'uso
ChrisR

5

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


5

Esegui questa query:

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

per me funziona


a proposito non è necessario SET time_zone = "+00: 00";
Safak Ciplak

3

Puoi farlo 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 è memorizzato come Epoch Seconds, il valore di timestamp "1970-01-01 00:00:00" (UTC) è riservato poiché il secondo # 0 viene utilizzato per rappresentare "0000-00-00 00:00:00 '.
  • In MariaDB 5.5 e prima poteva esserci 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 []>

3

Ho avuto un problema simile. In seguito risolto:

Modificare:

recollect_date TIMESTAMP DEFAULT 'CURRENT_TIMESTAMP',

per:

recollect_date TIMESTAMP DEFAULT CURRENT_TIMESTAMP,

cioè basta rimuovere le virgolette intorno a CURRENT_TIMESTAMP .

Spero che questo aiuti qualcuno.


3

Come accennato nella risposta di @Bernd Buffen. Questo è un problema con MariaDB 5.5, aggiorno semplicemente MariaDB 5.5 a MariaDB 10.1 e il problema è stato risolto.

Ecco i passaggi per aggiornare MariaDB 5.5 in MariaDB 10.1 su CentOS 7 (64 bit)

  1. Aggiungi le seguenti righe al repository MariaDB.

    nano /etc/yum.repos.d/mariadb.repo e incolla le seguenti righe.

[mariadb]
name = MariaDB
baseurl = http://yum.mariadb.org/10.1/centos7-amd64
gpgkey = https://yum.mariadb.org/RPM-GPG-KEY-MariaDB
gpgcheck = 1

  1. Ferma MariaDB, se già in esecuzione service mariadb stop
  2. Eseguire l'aggiornamento

    yum update

  3. Avvio di MariaDB ed esecuzione dell'aggiornamento

    service mariadb start

    mysql_upgrade

Tutto fatto.

Controlla la versione di MariaDB: mysql -V


NOTA : eseguire sempre il backup dei database prima di eseguire gli aggiornamenti. I dati possono essere persi se l'aggiornamento non è riuscito o qualcosa è andato storto.




2

Per Mysql5.7, accedi alla riga di comando di mysql ed esegui il comando,

mysql> show variables like 'sql_mode' ;

Mostrerà che NO_ZERO_IN_DATE, NO_ZERO_DATE in sql_mode.

inserisci qui la descrizione dell'immagine

Prova ad aggiungere una riga sotto [mysqld] nel tuo file di configurazione mysql per rimuovere le due opzioni, la mia (mysql 5.7 su Ubuntu 16) è /etc/mysql/mysql.conf.d/mysqld.cnf

inserisci qui la descrizione dell'immagine

Ora riavvia mysql. Funziona!


0

Per Mysql8.0.18:

CURRENT_TIMESTAMP([fsp])

Rimuovere "([fsp])", ha risolto il mio problema.


0
  1. Innanzitutto, verifica che le modalità esistenti stiano utilizzando il seguente comando nel tuo terminale:

    $ mysql -u root -p -e "SHOW VARIABLES LIKE 'sql_mode';"

    o

    mysql> show variables like 'sql_mode';

    Vedresti un output come di seguito

    inserisci qui la descrizione dell'immagine

  2. Disabilita modalità tramite my.cnf: in questo caso, è necessario rimuovere le modalità NO_ZERO_IN_DATE, NO_ZERO_DATE

    Apri il file my.cnf (in genere potresti trovare il file my.cnf situato in /etc/my.cnf o /etc/mysql/my.cnf)

    Aggiorna le modalità in my.cnf sotto l' [mysqld]intestazione

    sql_mode=ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION

    Qui ho omesso le modalità NO_ZERO_IN_DATE, NO_ZERO_DATE

  3. Riavvia il server mysql

    $ /etc/init.d/mysql restart

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.