Valores por defecto por tipo de dato en Mysql

El valor por defecto para un campo de una tabla se indica luego del tipo de dato mediante

DEFAULT <valor>

donde valor en la mayoría de los casos debe ser una constante. Digo en la mayoría porque si el campo es un TIMESTAMP (o un DATETIME desde Mysql 5.6), entonces podemos utilizar CURRENT_TIMESTAMP como valor por defecto.

Se dice que un valor por defecto es explícito si queda indicado mediante un DEFAULT en la definición del campo.

Antes de empezar les aclaro que debemos hacer un análisis independiente para comprender el funcionamiento en un campo de tipo TIMESTAMP.

Para los restantes, si un campo no tiene definido un valor por defecto, entonces Mysql lo determina de la siguiente manera:

  • Si el campo soporta el valor NULL, se lo define con un DEFAULT NULL explícito.
  • Si el campo se define como NOT NULL (NO soporta el valor NULL), depende de la versión de Mysql:

Para ver los valores por defecto explícitos de los campos de una tabla podemos utilizar:

SHOW CREATE TABLE <NOMBRE_TABLA>

 

Agregar y modificar registros en Mysql >= 5.02

Cuando se intenta hacer un INSERT o REPLACE sin un valor para el campo, o un UPDATE con NULL, Mysql trata el caso según el modo:

  • Si está activado el modo estricto y
    • la tabla es transaccional: se genera un error y se revierte la acción
    • la tabla no es transaccional: se genera un error pero si sucede en la segunda fila o posteriores de una sentencia que afecta a varias filas múltiple, las previas se habrán insertado!
  • Si NO está activado el modo estricto: Mysql establece el valor implícito según el tipo de dato del campo

Valores implícitos según el tipo de campo

  • Textos:
    • ENUM: el primer valor
    • BLOB: no puede tener un valor por defecto
    • TEXT: no puede tener un valor por defecto
    • Cadenas de caracteres (variantes de CHAR y BINARY): ” cadena vacía
  • Numérico (variantes de INT, FLOAT, DOUBLE, DECIMAL, NUMERIC): 0
    • Excepción si son INT o FLOAT con autoincrement: próximo valor en la secuencia
  • Fechas y horas: el valor “cero” según el tipo
    • DATE: 0000-00-00
    • TIME: 00:00:00
    • DATETIME: 0000-00-00 00:00:00
    • YEAR: 0000
    • Mysql >= 5.6.6 con explicit_defaults_for_timestamp activado (ver funcionamiento de TIMESTAMP):
      • TIMESTAMP: 0000-00-00 00:00:00

Funcionamiento de TIMESTAMP

Hasta Mysql 5.6.6 el tipo de dato TIMESTAMP se comporta de una manera completamente distinta al resto:

  • Un campo TIMESTAMP que no fue declarado explícitamente como NULL ni con un DEFAULT, se establece como su valor por defecto:
    • si es el primer campo TIMESTAMP de la tabla: CURRENT_TIMESTAMP (fecha y hora actuales)
    • si es un campo TIMESTAMP, pero no el primero: 0000-00-00 00:00:00

Desde Myqsl 5.6.6 en adelante, este uso de TIMESTAMP con un DEFAULT implícito está desaprobado y temporalmente existirá un warning para activar la variable explicit_defaults_for_timestamp de manera que el comportamiento sea:

  • Un campo TIMESTAMP:
    • no funciona con un DEFAULT CURRENT_TIMESTAMP a menos que se lo haya indicado explícitamente
    • declarado como NOT NULL y sin un DEFAULT explícito, se comporta como el resto de los tipos de dato (SIN un DEFAULT explícito)

En futuras versiones se mantendrá sólo este comportamiento y desaparecerá la variable mencionada.

Tagged with: , , , , ,
Publicado en Aplicaciones