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í?
Respuestas:
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.fuente
Si generó el script desde el banco de trabajo MySQL.
Se genera la siguiente línea.
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
fuente
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:
Nota al margen, si desea insertar NULLS:
fuente
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.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[mysqld]
.y establece
sql_mode
lo siguiente:NO_ZERO_IN_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION
Guarde y luego reinicie el servicio mysql haciendo:
sudo service mysql restart
fuente
sql_mode
no 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:16sql_mode
entrada ya estaba allí.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: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: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.
fuente
Pude resolver este problema en OS X instalando MySQL desde Homebrew
agregando lo siguiente a /usr/local/etc/my.cnf
y reiniciando MySQL
fuente
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
fuente
Para evitar este problema, debe eliminarlo
NO_ZERO_DATE
de la configuración del modo mysql.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.
fuente
Simplemente defina las siguientes líneas en la parte superior de su archivo SQL de base de datos.
Me esta funcionando.
fuente
Para deshabilitar el modo SQL estricto
En el archivo, ingrese estas dos líneas:
Finalmente, reinicie MySQL con este comando:
fuente
Es posible que desee examinar la configuración de la zona horaria en la instancia de MySql:
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
y reinicia todo
fuente
Los valores predeterminados deben comenzar desde el año 1000.
Por ejemplo,
Espero que esto ayude a alguien.
fuente
Cambia esto:
A lo siguiente:
fuente
Podrías cambiar esto:
A algo como esto:
fuente
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',fuente