mysql - number - Valor predeterminado no válido para el campo de marca de tiempo ''create_date''
mysql time default value (11)
Tengo la siguiente declaración 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 el siguiente error
ERROR 1067 (42000): Invalid default value for ''create_date''
¿Cuál es el error aquí?
Con OS X , instale mysql desde Homebrew , variables del sistema en función de sus valores predeterminados compilados. La solución es eliminar "NO_ZERO_DATE" de las variables del sistema "sql_mode".
Solo por favor tenga en cuenta que el alcance involucra.
Si desea afectar solo en su sesión, use "@@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 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.
En Ubuntu Desktop 16.04, hice esto:
abrir archivo:
/etc/mysql/mysql.conf.d/mysqld.cnf
en un editor de su elección.Busque:
sql_mode
, estará en algún lugar debajo de[mysqld]
.y establece
sql_mode
a lo siguiente:NO_ZERO_IN_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION
Guarde y reinicie el servicio de mysql haciendo:
sudo service mysql restart
Espero que esto ayude a alguien.
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 configurada en BST en lugar de UTC, y así en la tabla de creación el valor predeterminado de ''1970-01-01 00:00:01'' se coaccionaba 1 hora atrás, lo que resulta 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ó. Cuando estaba ejecutando Centos / 7, simplemente lo hice
# timedatectl set-timezone UTC
y reinició todo.
Eso es debido al modo SQL del servidor - NO_ZERO_DATE .
De la referencia: NO_ZERO_DATE
- En modo estricto, no permita que ''0000-00-00''
sea una fecha válida. Todavía puede insertar fechas cero con la opción IGNORE . Cuando no está en modo estricto, la fecha es aceptada pero se genera una advertencia.
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
Para evitar este problema, debe eliminar NO_ZERO_DATE
de la configuración del modo mysql.
- Ir a ''phpmyadmin''.
- Una vez que phpmyadmin esté cargado, haga clic en la pestaña ''variables''.
- Busque ''modo sql''.
- Haga clic en la opción Editar y elimine
NO_ZERO_DATE
(y su coma posterior) de la configuración.
Este es un problema muy común en el entorno local con wamp o xamp.
Podrías cambiar esto:
`create_date` TIMESTAMP NOT NULL DEFAULT ''0000-00-00 00:00:00'',
Para algo como esto:
`create_date` TIMESTAMP NOT NULL DEFAULT ''2018-04-01 12:00:00'',
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
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 de SQL_MODE, y luego la secuencia de comandos debería funcionar bien
de lo contrario, podría establecer SQL_MODE como Permitir fechas inválidas SET SQL_MODE=''ALLOW_INVALID_DATES'';
.
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);
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