Valor predeterminado no válido para el campo de marca de tiempo 'create_date'


186

Tengo la siguiente declaración de creación SQL

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 el siguiente error

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

¿Cuál es el error aquí?


No puedo ver nada malo con su consulta y funciona en la comunidad 5.1.50 recién probada.
Jaspreet Chahal

La consulta también está bien al final.
Shakti Singh

No estoy seguro, pero dale un nombre diferente a ese campo y prueba.
Naveen Kumar

Yo uso mysql 5.1.56 comunidad en ubuntu 10.04. y no funciona
robert

55
La fecha sin cero requiere una fecha. Use '1970-01-01 00:00:01'. [tomado de aquí] [1] [1]: dba.stackexchange.com/questions/6171/…
Jadeye

Respuestas:


176

Esto se debe al modo SQL del servidor: NO_ZERO_DATE .

De la referencia: NO_ZERO_DATE- En modo estricto, no permitir '0000-00-00'como fecha válida. Aún puede insertar fechas cero con la opción IGNORE . Cuando no está en modo estricto, se acepta la fecha pero se genera una advertencia.


19
¿Cómo doy la opción de ignorar?
robert

9
No puedes ignorar esta opción. Esta es la opción del servidor. Si tiene acceso a my.ini (archivo de configuración mysql), elimine NO_ZERO_DATE de la opción sql-mode y reinicie el servidor.
Devartir

77
Para marcar esta opción, ejecute MOSTRAR VARIABLES COMO 'sql_mode'
Devartir

66
Generé el script usando mysql workbench. En el script, sql_mode se establece en tradicional. Si elimino el tradicional, el script funciona.
robert

17
En las preferencias de MySQL Workbench, vaya a la pestaña 'Modelo: MySQL'. Establece 'SQL_MODE para ser usado en scripts generados' a "STRICT_TRANS_TABLES, NO_AUTO_CREATE_USER, NO_ENGINE_SUBSTITUTION" Eso resuelve el problema para siempre.
sgtdck

140

Si generó el script desde el banco de trabajo MySQL.

Se genera la siguiente línea.

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

Elimine TRADITIONAL del SQL_MODE, y luego el script debería funcionar bien

De lo contrario, podría establecer el SQL_MODE como Permitir fechas no válidas

SET SQL_MODE='ALLOW_INVALID_DATES';

1
Me ahorró algo de tiempo buscando por qué demonios no funciona :)
Srneczek 05 de

55
Ahhh gracias. SET SQL_MODE = 'ALLOW_INVALID_DATES'; fue un salvavidas. Tuve este problema cuando intenté migrar un sitio de WordPress a otro servidor (ambos locales) y no me permitió importar los datos de la base de datos debido a este error, a pesar de que no había filas en las tablas con este error.
mikato

¡Trabajado como un encanto! Gracias.
moreirapontocom

52

TIMESTAMP tiene un rango de '1970-01-01 00:00:01' UTC a '2038-01-19 03:14:07' UTC (ver doc ). El valor predeterminado debe estar dentro de ese rango.

Otro comportamiento extraño, relacionado:

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 al margen, si desea insertar NULLS:

CREATE TABLE tbl4 (
    ts TIMESTAMP NULL DEFAULT NULL);

1
Esto me está pasando a mí. ¿Qué está pasando? ¡ts2 ni siquiera es "NOT NULL" ...!
PedroD

2
Puede ser porque "Si no establece un valor para la primera columna TIMESTAMP en una tabla, MariaDB le asignará automáticamente la fecha y hora actuales al realizar una consulta ACTUALIZAR o INSERTAR en la (s) fila (s) en cuestión". - MariaDB Docs
jsphpl

1
Me gusta el uso de column_name TIMESTAMP DEFAULT NOW(). Puede que no sea apropiado para cada situación, pero pensé en compartirlo ya que también estaba lidiando con esto.
DeezCashews

1
column_name TIMESTAMP DEFAULT '1970-01-01 00:00:01' hizo el truco para mí. ¡Gracias!
metafa

42

En ubuntu desktop 16.04, hice esto:

  1. abrir archivo: /etc/mysql/mysql.conf.d/mysqld.cnfen un editor de su elección.

  2. Busque: sql_modeestará en algún lugar debajo [mysqld].

  3. y establece sql_modelo siguiente:

    NO_ZERO_IN_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION

  4. Guarde y luego reinicie el servicio mysql haciendo:

    sudo service mysql restart


8
Ayudó, excepto que sql_modeno estaba allí para mi instancia de mySQL en ubuntu16.04. Tuve que agregar una entrada en el archivo, eliminando el "NO_ZERO_DATE". Entonces, así es como se ve ahora: #Agregando la línea a continuación para deshacerse de no_zero_date sql_mode = ONLY_FULL_GROUP_BY, STRICT_TRANS_TABLES, NO_ZERO_IN_DATE, ERROR_FOR_DIVISION_BY_ZERO, NO_AUTO_CREATESUS_, 09:16
09 de

tienes razón ... Agregué eso antes para deshabilitar el modo estricto ... y cuando lo edité para este problema en particular, la sql_modeentrada ya estaba allí.
Mubashar Abbas

¿Es esto un error? CURRENT_TIMESTAMP nunca debe devolver "0000-00-00 00:00:00", o me equivoco? ¿Por qué debería tener que cambiar la configuración de mysqld?
letsjump

@letsjump porque alguien configuró su servidor mysql incorrectamente. Me encuentro con este problema con una base de datos que importé. El valor predeterminado para la marca de tiempo en una columna no es un valor de marca de tiempo válido. la solución REAL es actualizar la marca de tiempo predeterminada a algo válido como 1970, la fecha más temprana disponible. La solución temporal es deshabilitar la comprobación de la base de datos.
anon58192932

9

Usando OS X , instale mysql desde Homebrew , variables del sistema basadas en sus valores predeterminados compilados. La solución es eliminar "NO_ZERO_DATE" de las variables del sistema "sql_mode".

Solo tenga en cuenta que el alcance implica.

Si desea afectar solo en su sesión, utilice "@@session", por ejemplo:

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".

En este caso, no afectará una vez que finalice su sesión o que la cambie. No tiene efecto en otra sesión.

Si desea afectar a todos los clientes, utilice "@@global", por ejemplo:

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".

En este caso, solo afecta a los clientes que se conectan después del cambio (no afecta a todos los clientes actuales), y no funcionará una vez que el servidor salga.


8

Pude resolver este problema en OS X instalando MySQL desde Homebrew

brew install mysql

agregando lo siguiente 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

y reiniciando MySQL

brew tap homebrew/services
brew services restart mysql

7

Tuve un problema similar con MySQL 5.7 con el siguiente código:

`update_date` TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP

Lo arreglé usando esto en su lugar:

`update_date` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP


2
Creo que esta es realmente la mejor opción para cuando tiene sentido establecer el valor predeterminado actual, sin embargo, no tendría sentido para la marca de tiempo de nacimiento, solo como un ejemplo.
miau

7

Para evitar este problema, debe eliminarlo NO_ZERO_DATEde la configuración del modo mysql.

  1. Ve a 'phpmyadmin'.
  2. Una vez que se carga phpmyadmin, haga clic en la pestaña 'variables'.
  3. Busque 'modo sql'.
  4. Haga clic en la opción Editar y elimine NO_ZERO_DATE(y su coma final) de la configuración.

Este es un problema muy común en el entorno local con wamp o xamp.


6

Simplemente defina las siguientes líneas en la parte superior de su archivo SQL de base de datos.

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

Me esta funcionando.


2

Para deshabilitar el modo SQL estricto

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

En el archivo, ingrese estas dos líneas:

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

Finalmente, reinicie MySQL con este comando:

sudo service mysql restart

1

Es posible que desee examinar la configuración de la zona horaria en la instancia de MySql:

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

en mi caso, me di cuenta de que el sistema subyacente tenía su zona horaria establecida en BST en lugar de UTC, por lo que en la tabla de creación el valor predeterminado de '1970-01-01 00:00:01' se estaba reduciendo 1 hora, lo que resultó en un valor de marca de tiempo no válido

Para mí, en realidad quería que la zona horaria de la máquina se configurara en UTC, y eso me solucionó. Mientras ejecutaba Centos / 7, simplemente lo hice

# timedatectl set-timezone UTC

y reinicia todo


1

Los valores predeterminados deben comenzar desde el año 1000.

Por ejemplo,

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

Espero que esto ayude a alguien.


1

Cambia esto:

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

A lo siguiente:

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

1
De la opinión: Hola, por favor no responda solo con el código fuente. Intente proporcionar una buena descripción sobre cómo funciona su solución. Ver: ¿Cómo escribo una buena respuesta? . Gracias
sɐunıɔ ןɐ qɐp

Si este es un sitio de WordPress, no actualice las tablas principales de WordPress. Muchos complementos esperan un valor de zeores, por lo que WordPress no puede cambiar este valor predeterminado por razones heredadas que romperían los complementos. Hilo de Wordpress y soporte de Wordpress . Cambiar la estructura de la base de datos sin familiaridad con el código que se basa en los valores predeterminados puede generar errores problemáticos. Si bien esto puede funcionar como una solución en muchos casos, podría causar estragos en otros. No es una solución universal.
SherylHohman

0

Podrías cambiar esto:

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

A algo como esto:

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

0

Podrías cambiar esto:

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

A algo como esto:

create_date varchar (80) NO NULO POR DEFECTO '0000-00-00 00:00:00',

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.