Actualización a MySQL 5.7 y el modo STRICT y insert into ()values(),

Por defecto, MySQL 5.7 es mucho más "estricto" que las versiones anteriores de MySQL. Eso puede hacer que tu aplicación falle. Para solucionar esto temporalmente, cambie el SQL_MODE a NO_ENGINE_SUBSTITUTION (igual que en MySQL 5.6):

set global SQL_MODE="NO_ENGINE_SUBSTITUTION";

MySQL 5.7, Dates/Fechas, y los valores por Defecto

Por defecto  SQL_MODE en MySQL 5.7 es:

ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION

Eso hace que MySQL funcione en modo "estricto" para tablas transaccionales.

“El modo estricto controla cómo MySQL maneja los valores no válidos o faltantes en las declaraciones de cambio de datos, como INSERT o UPDATE. Un valor puede ser inválido por varias razones. Por ejemplo, podría tener el tipo de datos incorrecto para la columna o podría estar fuera de rango. Falta un valor cuando una nueva fila para insertar no contiene un valor para una columna que no sea NULL que no tenga una cláusula DEFAULT explícita en su definición. (Para una columna NULA, se inserta NULL si falta el valor). El modo estricto también afecta a las declaraciones de DDL como CREAR TABLA. Para más información, consulte la documentación.

Esto también plantea un problema interesante con el valor predeterminado para la columna fecha / fecha y hora. Digamos que tenemos la siguiente tabla en MySQL 5.7 y queremos insertar una fila en ella:

CREATE TABLE `events_t` (
 
-> `id` int(11) NOT NULL AUTO_INCREMENT,
 
-> `event_date` datetime NOT NULL,
 
-> `profile_id` int(11) DEFAULT NULL,
 
-> PRIMARY KEY (`id`),
 
-> KEY `event_date` (`event_date`),
 
-> KEY `profile_id` (`profile_id`)
 
-> ) ENGINE=InnoDB DEFAULT CHARSET=latin1
 
-> ;
 
Query OK, 0 rows affected (0.02 sec)
 
 
 
insert into events_t (profile_id) values (1);
 
ERROR 1364 (HY000): Field 'event_date' doesn't have a default value

============================================================

Event_date no tiene un valor predeterminado, y estamos insertando una fila sin un valor para event_date. Eso provoca un error en MySQL 5.7. Si no podemos usar NULL, tendremos que crear un valor predeterminado. En modo estricto, y no podemos usar "0000-00-00" tampoco:

alter table events_t change event_date event_date datetime NOT NULL default '0000-00-00 00:00:00';
 
ERROR 1067 (42000): Invalid default value for 'event_date'
 
 
 
alter table events_t change event_date event_date datetime NOT NULL default '2000-00-00 00:00:00';
 
ERROR 1067 (42000): Invalid default value for 'event_date'

Tenemos que usar una fecha real:

alter table events_t change event_date event_date datetime NOT NULL default '2000-01-01 00:00:00';
 
Query OK, 0 rows affected (0.00 sec)
 
Records: 0 Duplicates: 0 Warnings: 0
 
 
 
insert into events_t (profile_id) values (1);
 
Query OK, 1 row affected (0.00 sec)
 

O, un enfoque mucho más probable es cambiar la lógica de la aplicación para:

  • Permitir valores nulos.
  • Siempre inserte las fechas reales (es decir, utilice la función NOW ()).
  • Cambie el campo de la tabla a la marca de tiempo y actualícelo automáticamente si no se ha asignado ningún valor.

Otras lecturas:

Lea el artículo de Morgan Tocker sobre cómo realizar la transición a MySQL 5.7 y consulte la documentación completa de sql_mode.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

  • insert into ()values(), strict mode, MySQL 5.7
  • 0 Users Found This Useful
Was this answer helpful?

Related Articles

Como crear Bases de Datos Mysql en Cpanel?

1) Ud puede crear facilmente las bases de datos y usuarios asi: Entre al Cpanel a) MySQL...

Como hago un Script de Conexión a MySql?

Dic 12 2016 : Nota a partir del php 5.6 se usara la función mysqli_connect (nootese la i) y en la...

1 Que es MySql?

MySQL (http://www.mysql.com) es un motor de base de datos libre de código abierto. Un motor de...

Como importo una base de datos Mysql

Se pueden im portar bases de datos Mysql usando PhpMyadmin que esta instalado en todos los...

Conexión Remota a MySql

Este tutorial Le enseñará como conectarse remotamente a su base de datos.   Paso 1. Ingresar a...