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);
- En qué tabla vamos a escribir.
- En qué columnas vamos a poner datos.
- 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');
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');
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)
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]');
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]');
Esto es mucho más rápido y se trata como una única transacción atómica (o se insertan todos, o no se inserta ninguno).
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';
En este caso:
- El
SELECTbusca todos los candidatos contratados. - El resultado de esa consulta se inserta directamente en la tabla
Empleados. - No hace falta poner
VALUES.
Existe otro comando llamado SELECT ... INTO NuevaTabla. La diferencia es que
INSERT INTO ... SELECTrequiere que la tabla destino ya existaSELECT INTOcrea 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 KEYoUNIQUE. - Intentar insertar un
NULLen una columnaNOT 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.
