insercion-datos-insert-into-sql

Inserción de datos con INSERT INTO en SQL

  • 4 min

Una base de datos vacía, pues… como que no tiene mucha gracia, no sirve de mucho. Para que sea útil, necesitamos poblarla de información.

El comando encargado de añadir nuevas filas a una tabla es INSERT INTO.

Parece una operación sencilla, pero hacerlo bien es importante para mantener la integridad de los datos (porque guardar datos a lo loco, como que no ayuda, claro).

Sintaxis básica

La forma fundamental de insertar un registro requiere definir dos cosas:

INSERT INTO NombreTabla (Columna1, Columna2, Columna3)
VALUES (Valor1, Valor2, Valor3);
Copied!
  1. En qué tabla vamos a escribir.
  2. En qué columnas vamos a poner datos.
  3. Qué valores vamos a guardar.

Por ejemplo, supongamos que tenemos nuestra tabla de Clientes.

INSERT INTO Clientes (Nombre, Apellido, Email, FechaRegistro)
VALUES ('Luis', 'Llamas', '[email protected]', '2023-10-01');
Copied!

El orden de los valores debe coincidir exactamente con el orden de las columnas que hemos listado.

  • El primer valor (‘Luis’) va a la primera columna (Nombre).
  • El segundo valor (‘Llamas’) va a la segunda (Apellido),
  • Y así sucesivamente.

Insert sin especificar columnas

T-SQL permite una sintaxis abreviada donde no listamos las columnas, asumiendo que vamos a dar valores para todas ellas en el orden en que fueron creadas.

-- ⛔ MALA PRÁCTICA: Insertar sin definir columnas
INSERT INTO Clientes
VALUES ('Luis', 'Llamas', '[email protected]', '2023-10-01');
Copied!

No hagáis eso. Siempre especifica la lista de columnas explícitamente.

Si mañana alguien modifica la tabla y añade una nueva columna al principio, o cambia el orden de las columnas, insertará los datos en la columna equivocada.

Manejo de columnas especiales

No siempre es necesario (o posible) dar valor a todas las columnas de la tabla. Por ejemplo en estos casos.

Columnas IDENTITY

Si tenemos una columna ID definida como IDENTITY(1,1), SQL Server genera el número automáticamente. No podemos incluirla en nuestro INSERT.

-- Suponiendo que ClienteID es IDENTITY
INSERT INTO Clientes (Nombre, Apellido) -- Nos saltamos ClienteID
VALUES ('Ana', 'García');
-- SQL Server asignará el ID automáticamente (ej: 101)

Copied!

Columnas con DEFAULT o que permiten NULL

Si una columna tiene un valor DEFAULT o permite nulos, podemos omitirla en la lista.

-- Omitimos FechaRegistro, así que SQL usará la fecha actual (DEFAULT)
INSERT INTO Clientes (Nombre, Apellido, Email)
VALUES ('Carlos', 'Pérez', '[email protected]');

Copied!

Inserción múltiple Bulk Insert

¿Qué pasa si queremos insertar 10 usuarios? Antiguamente, teníamos que ejecutar 10 sentencias INSERT por separado. Esto es ineficiente porque implica 10 envios al servidor.

Desde SQL Server 2008, podemos insertar múltiples filas en una sola sentencia, separando las tuplas de valores por comas.

INSERT INTO Clientes (Nombre, Apellido, Email)
VALUES 
    ('Laura', 'Méndez', '[email protected]'),
    ('Pedro', 'Sánchez', '[email protected]'),
    ('Sofía', 'Ruiz', '[email protected]');
Copied!

Insertar datos desde otra tabla INSERT INTO SELECT

A veces no queremos insertar valores literales, sino copiar datos de una tabla a otra. Por ejemplo, pasar datos de una tabla Candidatos a Empleados cuando son contratados, o hacer un archivado de datos antiguos.

Para esto combinamos INSERT INTO con SELECT.

INSERT INTO Empleados (Nombre, Apellido, Email)
SELECT Nombre, Apellido, EmailLaboral
FROM Candidatos
WHERE Estado = 'Contratado';
Copied!

En este caso:

  1. El SELECT busca todos los candidatos contratados.
  2. El resultado de esa consulta se inserta directamente en la tabla Empleados.
  3. No hace falta poner VALUES.

Existe otro comando llamado SELECT ... INTO NuevaTabla. La diferencia es que

  • INSERT INTO ... SELECT requiere que la tabla destino ya exista
  • SELECT INTO crea la tabla nueva al vuelo

¿Podían haberlo hecho más complicado? La verdad, es díficil 🙄

¿Qué pasa si falla un INSERT?

El INSERT puede fallar por varias razones relacionadas con las restricciones (Constraints) que vimos en el Módulo 2:

  • Intentar insertar un duplicado en una columna PRIMARY KEY o UNIQUE.
  • Intentar insertar un NULL en una columna NOT NULL.
  • Insertar un valor que viola una FOREIGN KEY (ej: un pedido para un cliente que no existe).
  • Insertar un dato con el tipo incorrecto (ej: texto en un campo INT).

Si ocurre cualquiera de estos errores, SQL Server cancelará la operación y no se guardará la fila.