Menú de navegaciónMenú
Categorías

La mejor forma de Aprender Programación online y en español www.campusmvp.es

Fundamentos de SQL: Inserción de datos - INSERT

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.

SQL-Insercion-Datos

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.

campusMVP campusMVP es la mejor forma de aprender a programar online y en español. En nuestros cursos solamente encontrarás contenidos propios de alta calidad (teoría+vídeos+prácticas) creados y tutelados por los principales expertos del sector. Nosotros vamos mucho más allá de una simple colección de vídeos colgados en Internet porque nuestro principal objetivo es que tú aprendas. Ver todos los posts de campusMVP
Archivado en: Acceso a Datos

Boletín campusMVP.es

Solo cosas útiles. Una vez al mes.

🚀 Únete a miles de desarrolladores

DATE DE ALTA

x No me interesa | x Ya soy suscriptor

La mejor formación online para desarrolladores como tú

Comentarios (9) -

Gracias por la explicacion (sobre lo de la llaves primarias), tenia esa duda sobre si la BD generaba automaticamente el registro de ese campo (y)

Responder

jorge ugarte
jorge ugarte

Hola,

Mi duda es la siguiente, tengo ya una BD creada en SQL, así como sus tablas ya con datos ingresados, pero al momento de querer ingresar mas datos a la tabla se realizará como un INSERT INTO oh un UPDATE???

Responder

INSERT INTO, ya que el UPDATE es para actualizar datos que ya tienes guardados.

Responder

Hola, mi consulta es porque yo estoy creando una base histórica de información que sale cada mes y quiero agregarlo a una tabla sql e ir llenando y agregando la información mensual que proviene de Excel, primero importo la data a sql y el siguiente mes puedo importar de nuevo y poner la información en la misma tabla?  Saludos

Responder

Hola Mery:

Claro, no hay ningún problema. Es más, SQL Server incluye de serie herramientas para poder automatizar el proceso y todo.

Saludos.

Responder

quisiera saber si se puede agregar mas de un dato en un solo campo y como

Responder

campusMVP
campusMVP

Hola Canchis:

Si se trata de un campo especial, como uno para almacenar XML o JSON, entonces sí, pero sino cada campo tiene un determinado tipo de dato y eso es lo que puedes introducir en él. Claro está que si, por ejemplo, metes en un solo campo de texto múltiples datos delimitados de alguna manera, luego puedes procesarlos para obtener los datos individuales, pero ¿para qué querrías hacer algo así en una base de datos? Las bases de datos relacionales están optimizadas para almacenar y recuperar información y no ganarías nada, sino  al contrario: seguro que pierdes rendimiento y desde luego perderías flexibilidad y facilidad de uso.

Saludos.

Responder

edwin suarez palacio
edwin suarez palacio

Hola quisiera saber si ya tengo una tabla con datos ejemplo los paises del mundo pero no esta completa solo tengo 100 paises  y quiero completarla con una lista de países que esta en formato csv y esta completa con 240 paises, quisiera insertar ese listado en la tabla y que solo monte los paises que hacen falta

Responder

Héctor Díaz
Héctor Díaz

Hola Buenas moches, me gustaría saber plantearle la siguiente situación.
Tengo una pequeña aplicación que funciona perfecto en mi laptop pero cuando subo el código al servidor las instrucciones insert me resultan error internal.  Me podrías explicar por qué o cuales son las vías para resolver este. ojo : tanto en mi laptop como en el servidor hosting se utiliza la mismas versión de php. 7.2.10. Disculpe las molestias y le agradecería su ayuda.

Responder

Agregar comentario

Los datos anteriores se utilizarán exclusivamente para permitirte hacer el comentario y, si lo seleccionas, notificarte de nuevos comentarios en este artículo, pero no se procesarán ni se utilizarán para ningún otro propósito. Lee nuestra política de privacidad.