Ir al contenido principal

Inserción de datos

El recorrido completo

Todo lo que se vio hasta acá desemboca en este momento: el dato escrito en un casillero se convierte en una fila de una tabla. El camino tiene cuatro estaciones, y conviene verlas juntas porque ahí se entiende dónde puede romperse la cadena.

El recorrido de un dato: el usuario completa el formulario, los datos viajan en una petición POST, el servidor los valida y arma la orden de inserción, y el dato queda guardado en la tabla. Si algo no cumple las validaciones, el servidor devuelve al usuario al formulario con el aviso 1. Formulario el usuario escribe 2. Petición POST los datos viajan 3. Servidor valida y arma la orden 4. Tabla el dato queda si algo no cumple, vuelve al formulario con el aviso
El recorrido del dato. El paso 3 es el único que puede devolverlo: los otros tres solo pasan o no pasan.

Vale fijarse en una cosa del dibujo: el servidor es el único que decide. El formulario ayuda, pero el que revisa de verdad, el que arma la orden y el que recibe la respuesta de la base de datos es él. Por eso todo lo que se valida en el navegador tiene que volver a validarse en el servidor: es el único punto del camino que el usuario no controla.

Qué hace el servidor

Cuando la petición llega, el programa del servidor hace siempre los mismos pasos, en el mismo orden:

Paso Qué hace Qué pasa si se saltea
1. Recibir Toma los datos que llegaron: la lista de pares name = valor. —
2. Validar Revisa de nuevo que estén todos los obligatorios, que los tipos sean los correctos y que los valores tengan sentido. Entra cualquier cosa: texto donde va un número, fechas imposibles, campos vacíos.
3. Conectar Abre la conexión con la base de datos usando sus credenciales. —
4. Armar la orden Construye la sentencia SQL de inserción con los datos. Es el paso donde se juega la seguridad. Se ve más abajo.
5. Ejecutar La manda y espera la respuesta: salió bien, o falló y por qué. —
6. Responder Devuelve una página: de confirmación si salió bien, o el formulario otra vez con el error marcado. El usuario no sabe si su dato se guardó, y lo vuelve a cargar. Queda duplicado.

El paso 6 es el que menos se cuida y el que más problemas causa. Un formulario que se limpia solo después de guardar, sin decir nada, deja al usuario con la duda de si funcionó. Y la consecuencia típica es que lo carga de nuevo: si la clave no lo impide, quedan dos socios con el mismo nombre.

La sentencia INSERT

Todo el recorrido termina en una instrucción de SQL. Es la que efectivamente crea la fila:

INSERT INTO socios (nombre, correo, nacimiento)
VALUES ('Ana Pérez', '[email protected]', '1998-04-12');

Se lee casi como una frase, y tiene tres partes:

  • INSERT INTO socios: en qué tabla se va a insertar.
  • (nombre, correo, nacimiento): qué campos se van a llenar.
  • VALUES (...): con qué valores, en el mismo orden que los campos.

El orden es lo único que conecta las dos listas. Si se cambia el orden de los campos y no el de los valores, la base de datos no se queja: escribe el correo en la columna del nombre y sigue. El dato queda mal guardado sin ningún error, y eso es peor que un error.

Dos cosas que no hacen falta escribir. El campo del identificador, si está configurado como autonumérico, no se pone: el gestor lo asigna solo. Y los campos que no se nombran quedan con su valor por defecto o en NULL, según cómo se haya definido la tabla. Esa es una decisión que se tomó en el diseño, no acá.

Comillas, números y NULL

Cómo se escribe cada valor depende de su tipo, y equivocarse es la causa de la mitad de los errores de sintaxis:

Tipo de dato Cómo se escribe Ejemplo
TextoEntre comillas simples.'Ana Pérez'
NúmeroSin comillas, con punto decimal.1500, 12.5
FechaEntre comillas, en el formato del gestor.'1998-04-12'
Sin datoLa palabra NULL, sin comillas.NULL

Las comillas de SQL son simples, no dobles. Poner comillas dobles es un error que confunde muchísimo, porque en el gestor a veces funciona —depende de la configuración— y desde el servidor no. Y hay una distinción que hay que tener clara: NULL no es una cadena vacía ni un cero.

  • NULL significa «no hay dato»: no se sabe, no se preguntó, no corresponde.
  • '' —la cadena vacía— significa «el dato existe y está vacío».
  • 0 significa «el valor es cero».

Son tres cosas distintas y se usan para cosas distintas. Un campo teléfono con NULL quiere decir que no se cargó; con '', que se declaró que no tiene. Confundirlos trae problemas al contar y al promediar: NULL no cuenta en los promedios y el cero sí, así que un promedio calculado sobre datos con ceros de relleno da mal y nadie entiende por qué.

Insertar varias filas de una vez

Cuando hay que cargar muchos datos, no hace falta una sentencia por fila. Se pueden encadenar varios grupos de valores:

INSERT INTO provincias (codigo, nombre)
VALUES
    ('ba', 'Buenos Aires'),
    ('cba', 'Córdoba'),
    ('sf', 'Santa Fe');

Es bastante más rápido que tres sentencias separadas, porque la base de datos resuelve todo el trabajo en una sola operación. Es lo que se usa para cargar una tabla de referencia —provincias, categorías, planes— de una sola vez. Y tiene una propiedad que conviene conocer: si una de las filas falla, según cómo esté configurada la operación puede no insertarse ninguna. Eso es una ventaja, no un problema: deja la tabla en un estado consistente en lugar de cargada a medias.

Seguridad de las consultas

Cuando un formulario envía valores que se usan en una consulta, hay que evitar que esos datos puedan cambiar la instrucción SQL. La explicación de la inyección SQL y las consultas preparadas está reunida en la Unidad 3.

Qué puede fallar

Aun con el formulario bien hecho y la sentencia bien armada, la base de datos puede rechazar la inserción. Y está bien que lo haga: es su trabajo. Las razones más comunes:

Qué pasó Por qué lo rechaza
Se mandó texto donde va un número El tipo del campo no lo admite.
Faltó un campo obligatorio La columna está declarada NOT NULL.
Se repitió un documento, un correo o un código Hay una clave única o una clave primaria sobre ese campo.
Se puso el código de una provincia que no existe La clave foránea apunta a una fila que no está.
El texto es más largo de lo que admite la columna El campo tiene un largo máximo declarado.
La fecha no existe El 31 de febrero no es una fecha válida para el gestor.

Todas esas reglas se definieron en la Unidad 1, al diseñar las tablas, y son exactamente las que ahora están trabajando. Es el momento en que el diseño deja de ser teoría: los tipos, las claves y las restricciones son la última línea de defensa de la calidad del dato. Aunque el formulario esté mal, aunque el servidor no valide nada, aunque alguien escriba la sentencia a mano, la base no va a guardar un dato que viole sus reglas.

Dicho eso, hay que evitar una conclusión equivocada: que la base rechace el dato no es un buen manejo del error. Significa que el error llegó demasiado lejos. Cuando eso pasa, el usuario tiene que ver un mensaje claro que le diga qué corregir, no una página de error del servidor. Y si se trata de una clave duplicada, el mensaje tiene que decir «ya existe un socio con ese documento» —eso lo entiende cualquiera— y no «Duplicate entry '30123456' for key 'socios.documento'», que es lo que dice la base de datos y no le sirve a nadie.

Comprobar que quedó guardado

Después de insertar, conviene verificar en lugar de confiar. La comprobación es una consulta de lectura, y es la primera que se ve del lenguaje SQL:

SELECT * FROM socios WHERE documento = '30123456';

Se pide a la tabla socios que devuelva todas las columnas de las filas cuyo documento sea ese. Si aparece una fila con los datos correctos, la inserción funcionó. Y si en lugar de una aparecen dos, se descubrió un problema que de otro modo no se habría notado hasta mucho después: el formulario se envió dos veces y quedaron dos socios. Ese es el tipo de dato sucio que después cuesta limpiar, porque hay que decidir cuál de los dos es el bueno. La consulta SELECT, con sus condiciones y sus filtros, es el tema de la página siguiente.

Resumen

  • El recorrido tiene cuatro estaciones: formulario, petición, servidor y tabla.
  • El servidor es el único que decide: revisa de nuevo, arma la orden y recibe la respuesta.
  • Los pasos son recibir, validar, conectar, armar, ejecutar y responder.
  • Responder bien es parte del trabajo: un formulario que se vacía en silencio hace que el usuario cargue el dato dos veces.
  • INSERT INTO tabla (campos) VALUES (valores) crea la fila, con los valores en el mismo orden que los campos.
  • El texto y las fechas van entre comillas simples; los números, sin comillas; NULL, sin comillas.
  • NULL, la cadena vacía y el cero son tres cosas distintas.
  • Se pueden insertar varias filas de una vez, y es mucho más rápido.
  • Para proteger las consultas que usan valores del formulario, ver Inyección SQL y consultas preparadas.
  • La base de datos puede rechazar la inserción: tipos, campos obligatorios, claves únicas y foráneas, largos y fechas. Es la última línea de defensa.
  • Un rechazo necesita un mensaje claro para el usuario, no el texto del error del gestor.
  • Conviene comprobar con SELECT en lugar de confiar.

Seguir con la Unidad 4 · Proyectos