Modo estricto de MySQL

A partir de la versión 5, existe la posibilidad de ejecutar Mysql en modo estricto. Básicamente lo que controla es cómo Mysql debe responder cuando ciertas sentencias como INSERT o UPADATE intentan establecer valores inválidos o no indican valores requeridos.

Cuándo aplica el modo estricto

Consultando el modo actual de Mysql podremos saber si aplica o no el modo estricto:

  • Si el resultado contiene “STRICT_ALL_TABLES” o “STRICT_TRANS_TABLES”, el modo estricto está activado. Según cual de los dos valores esté establecido le comportamiento final difiere un poco (no entraremos en detalles ahora).

Por ejemplo, si la salida es:

STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION

entonces, el modo estricto está activado porque aparece el modo “STRICT_TRANS_TABLES”.

  • Si por el contrario, no aparece ninguno de estos 2 valores en el resultado, entonces el modo estricto no está establecido.

Obs: Existe un modo combinación llamado “TRADITIONAL” el cual representa la suma de los siguientes modos: STRICT_TRANS_TABLES, STRICT_ALL_TABLES, NO_ZERO_IN_DATE, NO_ZERO_DATE, ERROR_FOR_DIVISION_BY_ZERO,  NO_AUTO_CREATE_USER y NO_ENGINE_SUBSTITUTION.

Detalle del funcionamiento del modo estricto

  • Para tablas transaccionales (ej. InnoDB): se genera un error por valores faltantes o inválidos en una sentencia que cambia datos. La misma es abortada y se vuelven atrás los cambios realizados.
  • Para tablas no transaccionales (ej.MyISAM):
    • Si el valor incorrecto ocurre en la primer fila a ser insertada o actualizada, la sentencia se aborta y la tabla no se modifica.
    • Si la sentencia inserta o modifica varias filas y el valor incorrecto ocurre en la segunda fila o posterior, depende del modo estricto que esté en uso:
      • En STRICT_ALL_TABLES: Mysql retorna un error e ignora el resto de las filas! Como las filas anteriores han sido insertadas o actualizadas, el resultado es un cambio parcial. Para evitar esto, se recomienda utilizar sentencias que afecten a una sola línea y puedan ser abortadas sin modificar la tabla.
      • En STRICT_TRANS_TABLE: Mysql genera un alerta y continúa procesando la sentencia
        • Si el valor es inválido, se convierte al valor válido más cercano según el tipo de columna y se inserta.
        • Si el valor falta, se inserta el “valor por defecto para el tipo de dato de la columna”.

Si el modo es TRADITIONAL, Mysql se comporta como un sistema de base de datos “tradicional”, es decir, genera un error en lugar de una advertencia (warning) cuando se inserta un valor incorrecto en un campo, por lo que un INSERT o UPDATE aborta apenas esto ocurre. De manera similar a STRICT_ALL_TABLES, usando tablas no transaccionales esto podría no ser deseable, dado que los cambios realizados previamente al error no se podrían deshacer (roll back), resultando en una actualización parcial de registros.

También afecta el manejo de la división por cero, fechas cero y fechas con ceros:

  • Mysql < 5.7.4: trabajando en conjunción con los modos NO_ZERO_IN_DATE, NO_ZERO_DATE, ERROR_FOR_DIVISION_BY_ZERO
  • Mysql >= 5.7.4: tomando el comportamiento de los tres modos indicados arriba
Anuncios

Un comentario en “Modo estricto de MySQL

  1. Pingback: Los principales modos de funcionamiento de Mysql | Esas cosas que aprendo

Los comentarios están cerrados.