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.