Antes de la versión 5.0.2 de MySQL, se permitía insertar valores ilegales convirtiéndolos en valores legales. A partir de la versión 5.0.2, sigue este compartimiento por defecto, pero puede elegir un tratamiento para valores incorrectos más tradicional, como no aceptarlos y abortar los comandos que los incluyen. Esta sección describe el comportamiento por defecto de MySQL (permisivo), así como el nuevo modo estricto SQL y en qué se diferencian.
Lo siguiente es cierto si no usa modo estricto. Si inserta un
valor "incorrecto" en una columna, como
NULL
en una columna NOT
NULL
o una valor numérico demasiado grande en una
columna numérica, MySQL cambia el valor al "mejor valor
posible" para la columna en lugar de producir un error:
Si trata de almacenar un valor fuera de rango en una columna numérica, MySQL Server en su lugar almacena cero, el menor valor posible, o el mayor valor posible en la columna.
Para cadenas de caracteres, MySQL almacena una cadena vacía o tanto de la cadena de carácteras como quepa en la columna.
Si trata de almacenar una cadena de caracteres que no empiece con un número en una columna numérica, MySQL Server almacena 0.
MySQL le permite almacenar ciertos valores incorrectos en
columnas DATE
y
DATETIME
(tales como
'2000-02-31'
o
'2000-02-00'
). La idea es que no es el
trabajo del servidor SQL validar fechas. Si MySQL puede
almacenar una fecha y recuperarla fielmente, se almacena
tal y como se da. Si la fecha es totalmente incorrecta
(más allá de la capacidad del servidor para
almacenarla), se almacena en su lugar el valor especial
'0000-00-00'
.
Si intenta almacenar NULL
en una
columna que no admita valores NULL
ocurre un error para los comandos
INSERT
de un solo registro. Para
comandos INSERT
de varios registros o
para comandos INSERT INTO... SELECT
,
MySQL Server almacena el valor implícito para el tipo de
datos de la columna. En general, es 0
para tipos numéricos, cadena vacía
(""
) para tipos de cadenas de
caracteres, y el valor "cero" para tipos de fecha y
tiempo. Los valores implícitos por defecto se discuten en
Sección 13.1.5, “Sintaxis de CREATE TABLE
”.
Si un comando INSERT
no especifica un
valor para una columna, MySQL inserta su valor por defecto
si la columna especifica un valor mediante la cláusula
DEFAULT
. Si la definición no tiene tal
cláusula DEFAULT
clause, MySQL inserta
el valor por defecto implícito para el tipo de datos de
la columna.
La razón para las reglas anteriores es que no podemos validar esas condiciones hasta que los comandos han empezado a ejecutarse. No podemos deshacer si encontramos un problema tras actualizar algunos registros, ya que el motor de almacenamiento puede no soportar rollback. La opción de terminar el comando no es siempre positiva; en este caso, la actualización quedaría "a medias", lo que posiblemente es la peor opción. En este caso, lo mejor es hacerlo "lo mejor posible" y continuar como si nada hubiera ocurrido.
A partir de MySQL 5.0.2, puede seleccionar un tratamiento de
validación de datos de entrada más estricto usando los modos
SQL STRICT_TRANS_TABLES
o
STRICT_ALL_TABLES
. Consulte
Sección 5.3.2, “El modo SQL del servidor”.
STRICT_TRANS_TABLES
funciona así:
Para motores de almacenamiento transaccionales, valores incorrectos en cualquier parte del comando provocan que se aborte el comando y se deshaga el mismo.
Para motores no transaccionales, el comando aborta si
ocurre un error en el primer registro a insertar o
actualizar. (En este caso, el comando dejará la tabla
intacta, igual que en una tabla transaccional.) Los
errores en registros después del primero no abortan el
comando. En lugar de ello, los valores incorrectos se
ajustan y se generan advertencias en lugar de errores. En
otras palabras, con
STRICT_TRANS_TABLES
, un valor
incorrecto provoca que MySQL deshaga todas las
actualizaciones hechas hasta el momento, si es posible.
Para chequeo estricto, active
STRICT_ALL_TABLES
. Es equivalente a
STRICT_TRANS_TABLES
excepto que en motores
de almacenamiento no transaccionales, los errores abortan el
comando incluso cuando hay datos incorrectos a partir del
primer registro. Esto significa que si ocurre un error a
medias de una inserción o actualización de varios registros
en una tabla no transaccional, se produce una actualización
parcial. Los primeros registros se insertan o actualizan, pero
aquéllos a partir del punto en que ocurre el error no. Para
evitar esto en tablas no transaccionales, use inserciones de
un solo registro o use STRICT_TRANS_TABLES
para obtener advertencias en lugar de errores. Para evitar
problemas, no utilice MySQL para validar contenido de
columnas. Es preferible (y a menudo más rápido) dejar que la
aplicación se asegure de pasar sólo valores legales a la
base de datos.
Con cualquiera de las opciones de modo estricto, puede hacer
que se traten los errores como advertencias usando
INSERT IGNORE
o UPDATE
IGNORE
en lugar de INSERT
o
UPDATE
sin IGNORE
.
Ésta es una traducción del manual de referencia de MySQL, que puede encontrarse en dev.mysql.com. El manual de referencia original de MySQL está escrito en inglés, y esta traducción no necesariamente está tan actualizada como la versión original. Para cualquier sugerencia sobre la traducción y para señalar errores de cualquier tipo, no dude en dirigirse a mysql-es@vespito.com.