Resumen

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: 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.

      INSERT con subquery para authors