INSERT con subquery para authors
Clase 13 de 24 • Curso de SQL y MySQL 2018
Contenido del curso
CREATE
INSERT
Bash y archivos SQL
SELECT
Consultas en MySQL
Contenido Bonus
Insertar libros en una base de datos normalizada, sin duplicar autores, es más simple cuando dominas el uso de insert con subquery en MySQL. A partir de datos tipo CSV, podrás vincular tablas books y authors mediante author_id, aprovechar valores default y aplicar esta técnica con responsabilidad por su costo computacional.
¿Cómo integrar datos de un CSV a tablas normalizadas?
En un diseño normalizado, cada entidad vive en su tabla y se relaciona con enteros. El título va en books, el autor en authors, y se conectan por author_id. Desde un CSV, procesas fila a fila y mantienes la consistencia.
¿Qué estructura usan books y authors?
- El título vive en la tabla books.
- El autor vive en la tabla authors.
- La relación se hace con author_id como entero.
- Si omites valores, entran defaults: año (p. ej., 1900), precio (p. ej., 10), vendible en 1, idioma y URL según diseño.
¿Cómo insertar un primer libro conocido?
Primero obtienes el ID del autor y luego insertas el libro.
SELECT *
FROM authors
WHERE name = 'Octavio Paz';
-- Supongamos que devuelve author_id = 6
INSERT INTO books (title, author_id)
VALUES ('El laberinto de la soledad', 6);
- Si no envías el año, se aplica el valor default definido en el diseño.
- Verificación rápida:
SELECT * FROM books;
¿Qué pasa si no envías el año?
- Se usa el default del esquema. En el ejemplo, se observó un año base (p. ej., 1900) y precio base (p. ej., 10).
- Esto asegura inserciones consistentes incluso cuando el CSV viene incompleto.
¿Cómo usar un subquery en el insert para el author_id?
Cuando el autor ya existe y el CSV repite su nombre, el “truco” es anidar un select que traiga el ID del autor dentro del insert. Así evitas duplicados y automatizas el cruce.
INSERT INTO books (title, author_id, `year`)
VALUES (
'Vuelta al laberinto de la soledad',
(SELECT author_id FROM authors WHERE name = 'Octavio Paz' LIMIT 1),
1960
);
- Nota:
yearse encierra entre acentos invertidos porque es una función en SQL; así evitas confusiones. - MySQL permite este patrón; es potente, pero úsalo con cuidado.
¿Por qué limitar a un registro?
- Si el filtro del where es ambiguo, puedes traer más de un autor.
- Limitar el resultado a uno (“solo un registro”) reduce errores y hace explícita tu intención.
¿En qué orden se ejecuta?
- Primero se evalúa el subquery para obtener el author_id.
- Luego se ejecuta el insert usando ese valor.
¿Qué riesgos y buenas prácticas con subqueries y capa de negocio?
El patrón funciona muy bien, pero tiene costos. Es clave decidir qué ir en la base y qué en la capa de negocio.
- Costo en tiempo: con queries anidados, el tiempo “se eleva al cuadrado” al repetirse por cada tupla.
- Impacto en CPU: puede volverse costoso y calentar el equipo.
- Valida el where: si es poco preciso, insertarás información incorrecta.
- Preferencia práctica: resolver en la capa de negocio: traer todos los autores, mapear sus IDs y luego hacer insert limpios.
- MySQL es potente, pero úsalo con responsabilidad cuando mezcles insert y subquery.
- Lo que sigue: profundizar en select para consultas potentes, anidadas o combinadas, que generen relaciones y metadatos útiles para análisis y hasta para armar tablas con varios ejes.
¿Te gustaría ver ejemplos con tus tablas o CSV? Deja un comentario con tu estructura y dudas.