ERROR 1067 (42000): valor predeterminado no válido para 'created_at'

102

Cuando intenté modificar la tabla, mostró el error:

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

Busqué en Google este error, pero todo lo que encontré fue como si intentaran alterar la marca de tiempo para que ocurriera. Sin embargo, aquí estoy tratando de agregar una nueva columna y recibo este error:

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

y las dos últimas columnas de mi tabla son created_aty updated_at.

Aquí está la estructura de mi tabla:

ingrese la descripción de la imagen aquí

iamsujit
fuente
¿Cuáles son los valores predeterminados para estas columnas? ¿Puedes compartir la estructura de la mesa?
Priyanshu
@Priyanshu he actualizado la estructura de mi tabla
iamsujit
2
establezca el valor predeterminado current_timestamp para las dos últimas columnas.
Priyanshu

Respuestas:

144

El problema se debe a sql_modes . Por favor verifique sus sql_modes actuales por comando:

show variables like 'sql_mode' ; 

Y elimine sql_mode " NO_ZERO_IN_DATE, NO_ZERO_DATE " para que funcione. Este es el sql_mode predeterminado en las nuevas versiones de mysql.

Puede establecer sql_mode globalmente como root mediante el comando:

set global sql_mode = 'ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION';
Aman Aggarwal
fuente
7
Lo sé, pero en mi servidor sql_mode se muestra en blanco, todavía no funciona, estoy usando [Versión del servidor: 5.5.53-0ubuntu0.12.04.1 - (Ubuntu)]. ¿Alguien puede tener alguna solución sin actualizar la versión del servidor?
Priyabrata Atha
¿Ha verificado por comando global? y ¿no hay nada en sql_mode para la misma sesión?
Aman Aggarwal
Verifiqué mostrar variables como 'sql_mode'; y la salida es Variable_name | Value = sql_mode |
Priyabrata Atha
2
Esto será útil para esta respuesta stackoverflow.com/questions/2317650/…
Preshan Pradeepa
4
No me funcionó con 5.7. No estoy seguro de si tenía que hacerlo globalmente o no.
Brett
96

Simplemente, antes de ejecutar cualquier declaración, coloque esto en la primera línea:

SET sql_mode = '';
Ahmed Mohamed
fuente
eso fue simplemente asombroso. ¡Gracias, amigo!
Novasol
7
Gracias por el consejo. Pero solo eliminar las restricciones de fecha NO_ZERO_IN_DATE,NO_ZERO_DATEsolo nos permite mantener otras características de seguridad:SET sql_mode = 'ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION';
KeitelDOG
1
Para aclarar, esta declaración debe usarse solo en desarrollo, no en producción.
Ahmed Mohamed
Simple y directo al grano.
Frank Fotangs
28

Me encontré con el mismo error al intentar instalar una base de datos de terceros. Probé la solución propuesta sin éxito, es decir
SET sql_mode = '';

Luego probé el comando a continuación que funcionó permitiendo que se instalara la base de datos
SET GLOBAL sql_mode = '';

Martin Mohan
fuente
1
SET sql_mode = '';ahora está en desuso, SET GLOBAL sql_mode = ''está bien
Vadim Anisimov
26

Intente ejecutar el siguiente comando:

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

y

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

La razón por la que recibe este error es porque no está configurando un valor predeterminado para los campos created_aty updated_at. MySQL no acepta su comando ya que los valores de estas columnas no pueden ser nulos.

Espero que esto ayude.

Michele La Ferla
fuente
2
Gracias, voto positivo, prefiero esta solución en mi caso de uso
ChrisR
5

En mi caso tengo un archivo para importar. Así que simplemente agregué SET sql_mode = ''; al principio del archivo y funciona!

Tomás
fuente
5

Ejecute esta consulta:

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

esto funciona para mi

nienius
fuente
por cierto, no es necesario SET time_zone = "+00: 00";
Safak Ciplak
3

Puedes hacerlo así:

 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;
  • Debido a que el valor TIMESTAMP se almacena como Epoch Seconds, el valor de la marca de tiempo '1970-01-01 00:00:00' (UTC) está reservado ya que el segundo # 0 se usa para representar '0000-00-00 00:00:00 '.
  • En MariaDB 5.5 y antes, solo podía haber una columna TIMESTAMP por tabla que tenía CURRENT_TIMESTAMP definido como su valor predeterminado. Este límite ya no se aplica desde MariaDB 10.0.

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

muestra

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 []>
Bernd Buffen
fuente
3

Tuve un problema similar. Lo siguiente lo resolvió:

Cambio:

recollect_date TIMESTAMP DEFAULT 'CURRENT_TIMESTAMP',

a:

recollect_date TIMESTAMP DEFAULT CURRENT_TIMESTAMP,

es decir, simplemente elimine las comillas alrededor de CURRENT_TIMESTAMP .

Espero que esto ayude a alguien.

Bhushan
fuente
3

Como se menciona en la respuesta de @Bernd Buffen. Este es un problema con MariaDB 5.5, simplemente actualizo MariaDB 5.5 a MariaDB 10.1 y el problema se resolvió.

Aquí los pasos para actualizar MariaDB 5.5 a MariaDB 10.1 en CentOS 7 (64 bits)

  1. Agregue las siguientes líneas al repositorio de MariaDB.

    nano /etc/yum.repos.d/mariadb.repo y pega las siguientes líneas.

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

  1. Detenga MariaDB, si ya se está ejecutando service mariadb stop
  2. Realizar actualización

    yum update

  3. Iniciar MariaDB y realizar la actualización

    service mariadb start

    mysql_upgrade

Todo hecho.

Verifique la versión de MariaDB: mysql -V


NOTA : Siempre haga una copia de seguridad de las bases de datos antes de realizar actualizaciones. Los datos se pueden perder si la actualización falla o si algo salió mal.

Hassaan
fuente
3
SET GLOBAL sql_mode = '';

Resuelto mi problema.

ondi gusho
fuente
2

Para Mysql5.7, inicie sesión en la línea de comando de mysql y ejecute el comando,

mysql> show variables like 'sql_mode' ;

Mostrará que NO_ZERO_IN_DATE, NO_ZERO_DATE en sql_mode.

ingrese la descripción de la imagen aquí

Intente agregar una línea debajo de [mysqld] en su archivo de configuración de mysql para eliminar las dos opciones, la mía (mysql 5.7 en Ubuntu 16) es /etc/mysql/mysql.conf.d/mysqld.cnf

ingrese la descripción de la imagen aquí

Ahora reinicie mysql. ¡Funciona!

malajisi
fuente
0

Para Mysql8.0.18:

CURRENT_TIMESTAMP([fsp])

Eliminar "([fsp])", resolvió mi problema.

imldp
fuente
0
  1. Primero, verifique que los modos existentes estén usando el siguiente comando en su terminal:

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

    o

    mysql> show variables like 'sql_mode';

    Vería una salida como la siguiente

    ingrese la descripción de la imagen aquí

  2. Deshabilitar modo (s) a través de my.cnf: en este caso, debe eliminar los modos NO_ZERO_IN_DATE, NO_ZERO_DATE

    Abra el archivo my.cnf (generalmente puede encontrar el archivo my.cnf ubicado en /etc/my.cnf o /etc/mysql/my.cnf)

    Modos de actualización en my.cnf bajo el [mysqld]encabezado

    sql_mode=ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION

    Aquí he omitido los modos NO_ZERO_IN_DATE, NO_ZERO_DATE

  3. Reinicie el servidor mysql

    $ /etc/init.d/mysql restart

Thushan
fuente