mysql - updated_at - ERROR 1067(42000): valor predeterminado no válido para ''created_at''
invalid default value mysql (13)
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í Pasos para actualizar MariaDB 5.5 a MariaDB 10.1 en CentOS 7 (64-Bit)
-
Agregue las siguientes líneas al repositorio MariaDB.
nano /etc/yum.repos.d/mariadb.repo
y pegue las siguientes líneas.
[mariadb]
nombre = MariaDB
baseurl = http://yum.mariadb.org/10.1/centos7-amd64
gpgkey = https://yum.mariadb.org/RPM-GPG-KEY-MariaDB
gpgcheck = 1
-
Detener MariaDB, si ya está ejecutando el
service mariadb stop
-
Realizar actualización
yum update
-
Inicio de MariaDB y actualización
service mariadb start
mysql_upgrade
Todo hecho.
Verifique la versión de MariaDB:
mysql -V
Cuando traté de alterar la tabla, se muestra un error
ERROR 1067 (42000): Invalid default value for ''created_at''
busqué este error en Google, pero todo lo que encontré es que si intentaron alterar la marca de tiempo, se produjo este error, pero aquí estoy tratando de agregar una nueva columna y obtengo este error
mysql> ALTER TABLE investments ADD bank TEXT;
ERROR 1067 (42000): Invalid default value for ''created_at''
y mi tabla tiene las últimas dos columnas, son created_at y updated_at
aquí está la estructura de mi mesa
Ejecute esta consulta:
SET SQL_MODE = "NO_AUTO_VALUE_ON_ZERO";
SET time_zone = "+00:00";
esto funciona para mi
El problema se debe a sql_modes . Verifique sus sql_modes actuales por comando:
show variables like ''sql_mode'' ;
Y elimine el 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 por comando:
set global sql_mode = ''ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION'';
En mi caso tengo un archivo para importar. Entonces simplemente agregué SET sql_mode = ''''; al principio del archivo y funciona!
Intenta 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 obtiene este error es porque no está configurando un valor predeterminado para los campos
created_at
y
updated_at
.
MySQL no acepta su comando ya que los valores para estas columnas no pueden ser nulos.
Espero que esto ayude.
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 siguiente comando que funcionó permitiendo que se instalara la base de datos
SET GLOBAL sql_mode = '''';
Para Mysql5.7, inicie sesión en la línea de comando mysql y ejecute el comando mysql> show variables como ''sql_mode''; Mostrará ese NO_ZERO_IN_DATE, NO_ZERO_DATE en sql_mode.
Intente agregar una línea debajo de [mysqld] en su archivo mysql conf para eliminar las dos opciones, la mía (mysql 5.7 en Ubuntu 16) es /etc/mysql/mysql.conf.d/mysqld.cnf
Ahora reinicie mysql. ¡Funciona!
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 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 anteriores solo podía haber una columna TIMESTAMP por tabla que tuviera 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 []>
Simplemente conviértalo por esta línea:
para la nueva mesa:
CREATE TABLE t1 (
ts TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
);
para mesa existente:
Alter ts TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
Fuente :
https://dev.mysql.com/doc/refman/5.5/en/timestamp-initialization.html
Simplemente, antes de ejecutar cualquier declaración, ponga esto en la primera línea:
SET sql_mode = '''';
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.
SET GLOBAL sql_mode = '''';
Resuelto mi problema