Hasta ahora en esta serie de artículos sobre fundamentos del lenguaje SQL (recuerda que también tenemos un curso ideal para iniciarte) hemos visto cómo extraer información de una base de datos. Sin embargo para de poder extraer información de un almacén de datos, antes lógicamente debemos introducirla. En los sistemas gestores de datos relacionales la sentencia que nos permite hacerlo es INSERT.
La instrucción INSERT de SQL permite añadir registros a una tabla. Con ella podemos ir añadiendo registros uno a uno, o añadir de golpe tantos registros como nos devuelva una instrucción SELECT.
Veamos la sintaxis para cada uno de estos casos...
Insertando registros uno a uno
La sintaxis genérica de INSERT para crear un nuevo registro es la siguiente:
INSERT INTO NombreTabla [(Campo1, …, CampoN)] VALUES (Valor1, …, ValorN)
Siendo:
- NombreTabla: la tabla en la que se van a insertar las filas.
- (Campo1, …, CampoN): representa el campo o campos en los que vamos a introducir valores.
- (Valor1, …, ValorN): representan los valores que se van a almacenar en cada campo.
En realidad la lista de campos es opcional especificarla (por eso la hemos puesto entre corchetes en la sintaxis general). Si no se indica campo alguno se considera que por defecto vamos a introducir información en todos los campos de la tabla, y por lo tanto se deben introducir valores para todos ellos y en el orden en el que han sido definidos. En la práctica se suelen especificar siempre por claridad y para evitar errores.
Por otro lado, los valores se deben corresponder con cada uno de los campos que aparecen en la lista de campos, tanto en el tipo de dato que contienen como en el orden en el que se van a asignar. Es decir, si se indican una serie de campos en un orden determinado, la lista de valores debe especificar los valores a almacenar en dichos campos, en el mismo orden exactamente. Si un campo no está en la lista, se almacenará dentro de éste el valor NULL.
Si un campo está definido como NOT NULL (es decir, que no admite nulos o valores vacíos), debemos especificarlo siempre en la lista de campos a insertar. De no hacerlo así se producirá un error al ejecución la correspondiente instrucción INSERT.
Veamos unos ejemplos con la base de datos de ejemplo Northwind:
INSERT INTO Region VALUES(35, 'Madrid')
INSERT INTO Region (RegionID, RegionDescription) VALUES(35, 'Madrid')
INSERT INTO Shippers (ShipperID, CompanyName) VALUES(4, 'Mi Empresa')
En el tercer ejemplo no hemos asignado valores a la columna Phone, por tanto tomará automáticamente el valor NULL, salvo que tenga un valor DEFAULT asignado.
En realidad en la mayor parte de los casos los campos de identificación de los registros, también conocidos como claves primarias, serán campos de tipo numérico con auto-incremento. Esto quiere decir que el identificador único de cada registro (el campo que normalmente contiene un ID en su nombre, como RegionID o ShipperID) lo genera de manera automática el gestor de datos, incrementando en 1 su valor cada vez que se inserta un nuevo registro en la tabla. Por ello en estos casos no es necesario especificar este tipo de campos en las instrucciones INSERT. Por ello, por ejemplo, para insertar una nueva región en la tabla de regiones de Northwind lo único que hay que hacer es indicar su nombre, así:
INSERT INTO Region (RegionDescription) VALUES('Madrid')
Ahorrándonos tener que indicar el identificador.
Nota: Aunque las tablas estén relacionadas entre sí de manera unívoca (por ejemplo, cada cabecera de factura con sus líneas de factura), no es posible insertar de un golpe los registros de varias tablas. Es necesario siempre introducir los registros uno a uno y tabla a tabla.
Inserción masiva de filas partiendo de consultas
Una segunda variante genérica de la instrucción INSERT es la que nos permite insertar de golpe múltiples registros en una tabla, bebiendo sus datos desde otra tabla (o varias tablas) de nuestra base de datos o, incluso en algunos SGBDR, de otra base de datos externa. En cualquier caso obteniéndolos a partir de una consulta SELECT convencional.
La sintaxis genérica de la instrucción que nos permite insertar registros procedentes de una consulta SELECT es la siguiente:
INSERT INTO NombreTabla [(Campo1, …, CampoN)]
SELECT ...
El SELECT se indica a continuación de a lista de campos, y en lugar de especificar los valores con VALUES, se indica una consulta de selección. Es indispensable que los campos devueltos por esta instrucción SELECT coincidan en número y tipo de datos con los campos que se han indicado antes, o se producirá un error de ejecución y no se insertará ningún registro.
Veámoslo mejor con unos ejemplos sencillos de Northwind. Supongamos que tenemos una tabla nueva llamada NewCustomers en la que hemos introducido previamente los datos de nuevos clientes que no están en el sistema (por ejemplo por que los hemos cargado desde un programa externo) y queremos agregar a nuestra tabla de clientes pre-existente los nuevos clientes que son del país "España":
INSERT INTO Customers
SELECT * FROM NewCustomers WHERE Country = 'Spain'
Lo que se suele hacer en estos casos es crear primeramente la consulta de selección, que generalmente será más compleja y puede involucrar varias tablas que no tienen porque tener los mismos campos. Esta consulta la única condición que debe cumplir es que los campos devueltos tienen que ser del mismo tipo y orden que los que hay en la tabla donde insertamos o que los que indiquemos opcionalmente en la consulta de inserción.