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 = 6INSERTINTO 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.
INSERTINTO books (title, author_id,`year`)VALUES('Vuelta al laberinto de la soledad',(SELECT author_id FROM authors WHERE name ='Octavio Paz'LIMIT1),1960);
Nota: year se 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.