Valore predefinito non valido per il campo data / ora "create_date"


186

Ho la seguente istruzione sql create

mysql> CREATE  TABLE IF NOT EXISTS `erp`.`je_menus` (
    ->   `id` INT(11) NOT NULL AUTO_INCREMENT ,
    ->   `name` VARCHAR(100) NOT NULL ,
    ->   `description` VARCHAR(255) NOT NULL ,
    ->   `live_start_date` DATETIME NULL DEFAULT NULL ,
    ->   `live_end_date` DATETIME NULL DEFAULT NULL , 
    ->   `notes` VARCHAR(255) NULL ,
    ->   `create_date` TIMESTAMP NOT NULL DEFAULT  '0000-00-00 00:00:00',
    ->   `created_by` INT(11) NOT NULL ,
    ->   `update_date` TIMESTAMP NOT NULL DEFAULT  CURRENT_TIMESTAMP  ,
    ->   `updated_by` INT(11) NOT NULL , 
    ->   `status` VARCHAR(45) NOT NULL ,
    ->   PRIMARY KEY (`id`) ) 
    -> ENGINE = InnoDB;

dando il seguente errore

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

Qual è l'errore qui?


Non riesco a vedere nulla di sbagliato nella tua query e funziona sulla comunità 5.1.50 appena testata.
Jaspreet Chahal,

La domanda va bene anche da parte mia.
Shakti Singh,

Non sei sicuro ma dai un nome diverso a quel campo e prova?
Naveen Kumar,

io uso la community mysql 5.1.56 in Ubuntu 10.04. e non funziona
Robert

5
La data senza zero richiede una data. Usa "1970-01-01 00:00:01". [preso da qui] [1] [1]: dba.stackexchange.com/questions/6171/…
Jadeye,

Risposte:


176

Ciò è dovuto alla modalità SQL del server - NO_ZERO_DATE .

Dal riferimento: NO_ZERO_DATE- In modalità rigorosa, non consentire '0000-00-00'come data valida. Puoi comunque inserire zero date con l' opzione IGNORA . Quando non è in modalità rigorosa, la data viene accettata ma viene generato un avviso.


19
come posso dare l'opzione ignora?
robert

9
Non puoi ignorare questa opzione. Questa è un'opzione server. Se hai accesso a my.ini (file di configurazione mysql), rimuovi NO_ZERO_DATE dall'opzione modalità sql e riavvia il server.
Devart

7
Per selezionare questa opzione - esegui MOSTRA VARIABILI COME 'sql_mode'
Devart

6
ho generato lo script usando mysql workbench. Nello script sql_mode è impostato su tradizionale. Se rimuovo il tradizionale, lo script funziona.
robert,

17
Nelle preferenze di MySQL Workbench, vai alla scheda "Modello: MySQL". È stato impostato "SQL_MODE da utilizzare negli script generati" su "STRICT_TRANS_TABLES, NO_AUTO_CREATE_USER, NO_ENGINE_SUBSTITUTION" che risolve definitivamente il problema.
sgtdck,

140

Se hai generato lo script dal workbench di MySQL.

Viene generata la seguente riga

SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='TRADITIONAL,ALLOW_INVALID_DATES';

Rimuovere TRADITIONAL da SQL_MODE e quindi lo script dovrebbe funzionare correttamente

Altrimenti, è possibile impostare SQL_MODE come Consenti date non valide

SET SQL_MODE='ALLOW_INVALID_DATES';

1
Mi ha risparmiato un po 'di tempo a cercare perché diavolo non funziona :)
Srneczek,

5
Ahhh grazie. SET SQL_MODE = 'ALLOW_INVALID_DATES'; è stato un salvavita. Ho avuto questo problema durante la migrazione di un sito wordpress su un altro server (entrambi locali) e non mi permetteva di importare i dati del database a causa di questo errore, anche se non c'erano righe nelle tabelle con questo errore.
Mikato,

Ha funzionato come un fascino! Grazie.
moreirapontocom

52

TIMESTAMP ha un intervallo da '1970-01-01 00:00:01' UTC a '2038-01-19 03:14:07' UTC (vedi doc ). Il valore predefinito deve essere compreso in tale intervallo.

Altro comportamento strano, correlato:

CREATE TABLE tbl1 (
    ts TIMESTAMP);  
Query OK, 0 rows affected (0.01 sec)

CREATE TABLE tbl2 (
    ts TIMESTAMP,
    ts2 TIMESTAMP);
ERROR 1067 (42000): Invalid default value for 'ts2'

CREATE TABLE tbl3 (
    ts TIMESTAMP,
    ts2 TIMESTAMP DEFAULT '1970-01-01 00:00:01');
Query OK, 0 rows affected (0.01 sec)

Nota a margine, se si desidera inserire NULL:

CREATE TABLE tbl4 (
    ts TIMESTAMP NULL DEFAULT NULL);

1
Questo sta succedendo a me. Cosa sta succedendo? ts2 non è nemmeno "NOT NULL" ...!
PedroD

2
Potrebbe essere perché "Se non si imposta un valore per la prima colonna TIMESTAMP in una tabella, MariaDB assegnerà automaticamente la data e l'ora correnti quando si esegue una query UPDATE o INSERT sulle righe in questione." - MariaDB Docs
jsphpl

1
Mi piace l'uso di column_name TIMESTAMP DEFAULT NOW(). Potrebbe non essere appropriato per ogni situazione, ma ho pensato di condividere dato che mi occupavo anche di questo.
DeezCashews

1
nome_colonna TIMESTAMP DEFAULT '1970-01-01 00:00:01' ha fatto il trucco per me. Grazie!
metafa

42

In Ubuntu Desktop 16.04, ho fatto questo:

  1. apri file: /etc/mysql/mysql.conf.d/mysqld.cnfin un editor a tua scelta.

  2. Cerca sql_mode:, sarà da qualche parte sotto [mysqld].

  3. e impostare sql_modequanto segue:

    NO_ZERO_IN_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION

  4. Salvare e quindi riavviare il servizio mysql eseguendo:

    sudo service mysql restart


8
Mi ha aiutato, tranne per il sql_modefatto che non c'era per la mia istanza di mySQL su ubuntu16.04. Ho dovuto aggiungere una voce per esso nel file, rimuovendo il "NO_ZERO_DATE". Quindi, ecco come appare ora: #Adding il sotto la linea di sbarazzarsi di no_zero_date sql_mode = ONLY_FULL_GROUP_BY, STRICT_TRANS_TABLES, NO_ZERO_IN_DATE, ERROR_FOR_DIVISION_BY_ZERO, NO_AUTO_CREATE_USER, NO_ENGINE_SUBSTITUTION
OK999

hai ragione .. l'ho aggiunto in precedenza per disabilitare la modalità rigorosa .. e quando l'ho modificato per questo particolare problema, la sql_modevoce era già lì.
Mubashar Abbas,

è un insetto? CURRENT_TIMESTAMP non dovrebbe mai restituire "registrazione 00:00:00", o sbaglio? Perché dovrei cambiare le impostazioni di mysqld?
Letjump

@letsjump perché qualcuno ha configurato il tuo server mysql in modo errato. sto riscontrando questo problema con un database che ho importato. il valore predefinito per il timestamp in una colonna non è un valore di timestamp valido. la soluzione REAL è quella di aggiornare il timestamp predefinito a qualcosa di valido come il 1970 - la prima data disponibile. La soluzione temporanea è disabilitare il controllo sul database.
anon58192932

9

Utilizzando OS X , installa mysql da Homebrew , Variabili di sistema in base alle impostazioni predefinite compilate. La soluzione è rimuovere "NO_ZERO_DATE" dalle variabili di sistema "sql_mode".

Per favore, tieni presente che la portata comporta.

Se si desidera influire solo sulla sessione, utilizzare "@@session", ad esempio:

SET @@session.sql_mode ="ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION".

In questo caso, non avrà alcun effetto al termine della sessione o alla modifica. Non ha effetto su altre sessioni.

Se si desidera influire su tutti i client, utilizzare "@@global", ad esempio:

SET @@global.sql_mode ="ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION".

In questo caso, influisce solo sui client che si connettono dopo la modifica (non influisce su tutti i client correnti) e non funzionerà all'uscita dal server.


8

Sono stato in grado di risolvere questo problema su OS X installando MySQL da Homebrew

brew install mysql

aggiungendo quanto segue a /usr/local/etc/my.cnf

sql_mode=ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION

e riavviare MySQL

brew tap homebrew/services
brew services restart mysql

7

Ho avuto un problema simile con MySQL 5.7 con il seguente codice:

`update_date` TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP

Ho risolto usando questo invece:

`update_date` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP


2
Penso che questa sia in realtà l'opzione migliore per quando ha senso il default a corrente, tuttavia non avrebbe senso per il timestamp della nascita - solo come esempio.
miagolio il

7

Per evitare questo problema, è necessario rimuovere NO_ZERO_DATEdalla configurazione della modalità mysql.

  1. Vai a "phpmyadmin".
  2. Una volta caricato phpmyadmin, fai clic sulla scheda "variabili".
  3. Cerca 'modalità sql'.
  4. Fai clic sull'opzione Modifica e rimuovi NO_ZERO_DATE(e la sua virgola finale) dalla configurazione.

Questo è un problema molto comune nell'ambiente locale con wamp o xamp.


6

Basta definire le seguenti righe nella parte superiore del file SQL del database.

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

Funziona per me.


2

Per disabilitare la modalità SQL rigorosa

Create disable_strict_mode.cnf file at /etc/mysql/conf.d/

Nel file, inserisci queste due righe:

[mysqld]
sql_mode=IGNORE_SPACE,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION

Infine, riavvia MySQL con questo comando:

sudo service mysql restart

1

Potresti esaminare l'impostazione del fuso orario sull'istanza di MySql:

mysql> show variables like 'time_zone';
+---------------+--------+
| Variable_name | Value  |
+---------------+--------+
| time_zone     | SYSTEM |
+---------------+--------+

nel mio caso, mi sono reso conto che il sistema sottostante aveva il fuso orario impostato su BST anziché su UTC, quindi nella tabella di creazione il valore predefinito di '1970-01-01 00:00:01' veniva forzato indietro di 1 ora, risultando in un valore di data / ora non valido.

Per me, in realtà volevo che il fuso orario della macchina fosse impostato su UTC, e questo mi ha risolto. Mentre gestivo Centos / 7, l'ho fatto semplicemente

# timedatectl set-timezone UTC

e riavviato tutto.


1

I valori predefiniti dovrebbero iniziare dall'anno 1000.

Per esempio,

ALTER TABLE mytable last_active DATETIME DEFAULT '1000-01-01 00:00:00'

Spero che questo aiuti qualcuno.


1

Cambia questo:

`create_date` TIMESTAMP NOT NULL DEFAULT  '0000-00-00 00:00:00',
`update_date` TIMESTAMP NOT NULL DEFAULT  CURRENT_TIMESTAMP  ,

A quanto segue:

`create_date` TIMESTAMP NOT NULL DEFAULT  CURRENT_TIMESTAMP ,
`update_date` TIMESTAMP NOT NULL DEFAULT  CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP ,

1
Dalla recensione: Ciao, per favore non rispondere solo con il codice sorgente. Prova a fornire una bella descrizione del funzionamento della tua soluzione. Vedi: Come posso scrivere una buona risposta? . Grazie
sɐunıɔ ןɐ qɐp

Se si tratta di un sito WordPress, non aggiornare le tabelle principali di WordPress. Molti plug-in prevedono un valore di zeores, quindi WordPress non può modificare questo valore predefinito per motivi legacy che potrebbero interrompere i plug-in. Discussione Wordpress e supporto Wordpress . La modifica della struttura del database senza familiarità con il codice che si basa sui valori predefiniti può causare problemi problematici. Mentre questo può funzionare come soluzione in molti casi, potrebbe rovinare il caos in altri. Non è una soluzione universale.
SherylHohman,

0

Potresti semplicemente cambiare questo:

`create_date` TIMESTAMP NOT NULL DEFAULT '0000-00-00 00:00:00',

A qualcosa del genere:

`create_date` TIMESTAMP NOT NULL DEFAULT '2018-04-01 12:00:00',

0

Potresti semplicemente cambiare questo:

create_date datetime NOT NULL DEFAULT '0000-00-00 00:00:00',

A qualcosa del genere:

create_date varchar (80) NON NULL DEFAULT '0000-00-00 00:00:00',

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.