Sentencia INSERT INTO en SQL

INSERT INTO es la sentencia DML para la inserción de registros en las tablas de base de datos. La sentencia básica es muy simple y puede realizarse de dos maneras:

--Opción 1
INSERT INTO nombreTabla (columna1, columna2...) VALUES (valor1, valor2, ...)

--Opción 2
INSERT INTO nombreTabla VALUES (valor1, valor2, ...)

La diferencia principal radica en que desde la primera opción podemos añadir los registros de acuerdo a únicamente las columnas que queremos informar, mientras que la segunda opción nos obliga a informar todos los valores de las columnas de la tabla de acuerdo a su posición, aunque sean a valor NULL.

Es más eficiente y recomendable utilizar la primera opción indicada, señalando únicamente las columnas que desean ser informadas.

Atendiendo a dicha sintaxis, vamos a ver algunos ejemplos sobre nuestras tablas Clientes y Pedidos.

INSERT INTO

Informando nombre de las columnas

Una vez tengamos nuestras tablas creadas usando la sentencia CREATE TABLE, podemos proceder a rellenarlas de nuevos registros desde la sentencia INSERT INTO. A continuación, dejaremos los scripts de ejemplo que hemos utilizado para rellenar nuestras tablas Clientes y Pedidos:

  • INSERT INTO Clientes:
INSERT INTO Clientes (nombre, apellidos, direccion, cuenta)
VALUES ('Fernando', 'García Rodriguez', 'C/Virgen del rosal 28', 111222333);

INSERT INTO Clientes (nombre, apellidos, direccion, cuenta)
VALUES ('María', 'Lopez ruiz', 'C/ Alcalá 138', 123456789);

INSERT INTO Clientes (nombre, apellidos, direccion, cuenta)
VALUES ('Ana', 'Fernandez Montero', 'Av. de Santiago 11', 998344567);

INSERT INTO Clientes (nombre, apellidos, direccion, cuenta)
VALUES ('Luis', 'Sanchez García', 'C/ de la luz 21 ', 447824556);

INSERT INTO Clientes (nombre, apellidos, direccion, cuenta)
VALUES ('Alejandro', 'Valero Martinez', 'C/ Serrano 67', 778345112;

Podremos consultar los nuevos registros recién insertados desde la siguiente sencilla consulta:

SELECT * FROM Clientes;
idClientes nombre apellidos direccion cuenta
1 Fernando García Rodriguez C/ Virgen del rosal 28 111222333
2 María Lopez ruiz C/ Alcalá 138 123456789
3 Ana Fernandez Montero Av. de Santiago 11 998344567
4 Luis Sanchez García C/ de la luz 21 447824556
5 Alejandro Valero Martinez C/ Serrano 67 778345112
  • INSERT INTO Pedidos:

INSERT INTO Pedidos (producto, descripcionProducto, precio, fechaPedido, numeroProductos, idClientes)
VALUES ('Xiami Mi 11', 'Smartphone', '286.95', '2022-07-09', 15, 3);

INSERT INTO Pedidos (producto, descripcionProducto, precio, fechaPedido, numeroProductos, idClientes)
VALUES ('Play Station 5', 'Consola Sony', '549.95', '2022-07-18', 4, 2);

INSERT INTO Pedidos (producto, descripcionProducto, precio, fechaPedido, numeroProductos, idClientes)
VALUES ('Xbox series X', 'Consola Xbox', '499.99', '2022-01-21', 2, 2);

INSERT INTO Pedidos (producto, descripcionProducto, precio, fechaPedido, numeroProductos, idClientes)
VALUES ('MacBook Pro M1', 'Portátil Apple', '2449.5', '2022-06-20', 1, 1);

INSERT INTO Pedidos (producto, descripcionProducto, precio, fechaPedido, numeroProductos, idClientes)
VALUES ('Echo DOT 3', 'Altavoz Alexa', '39.99', '2022-09-01', 50, 4);

INSERT INTO Pedidos (producto, descripcionProducto, precio, fechaPedido, numeroProductos, idClientes)
VALUES ('Echo DOT 4', 'Altavoz Alexa', '59.99', '2022-09-01', 50, 4);

INSERT INTO Pedidos (producto, descripcionProducto, precio, fechaPedido, numeroProductos, idClientes)
VALUES ('Nintendo Switch', 'Consola Nintendo', '299.99', '2022-09-05', 3, 5);

Podremos consultar los nuevos registros recién insertados desde la siguiente sencilla consulta:

SELECT * FROM Pedidos;
idPedidos producto descripcionProducto precio fechaPedido numeroProductos totalPrecio idClientes
1 Xiami Mi 11 Smartphone 286,95 2022-07-09 15 4304,25 3
2 Play Station 5 Consola Sony 549,95 2022-07-18 4 2199,8 2
3 Xbox series X Consola Xbox 499,99 2022-01-21 2 999,98 2
4 MacBook Pro M1 Portátil Apple 2449,5 2022-06-20 1 2449,5 1
5 Echo DOT 3 Altavoz Alexa 39,99 2022-09-01 50 1999,5 4
6 Echo DOT 4 Altavoz Alexa 59,99 2022-09-01 50 2999,5 4
7 Nintendo Switch Consola Nintendo 299,99 2022-09-05 3 899,97 5

Al estar declarados los campos idClientes e idPedidos con la propiedad IDENTITY, no deben informarse en las columnas de las sentencias INSERT INTO. El sistema se encargará automáticamente de otorgarles un valor auto incremental de acuerdo a la definición de dicha propiedad en la declaración de las tablas.

El campo totalPrecio al estar especificado como una operación matemática resultado de la multiplicación de los campos precio y numeroProductos, queda exento de especificarse en la sentencia.

Sin informar nombre de las columnas

Este tipo de INSERT INTO puede sernos útiles cuando queramos informar la mayoría o todos los campos de una tabla, ya que en algunas ocasiones puede ahorrarnos tiempo en la escritura de la sentencia. Sin embargo, cabe destacar que tiene algunas limitaciones que, en ocasiones, la convierten en una opción descartable.

La peculiaridad de este INSERT INTO , como ya comentamos, es que obliga a tomar en cuenta todos los campos de la tabla, debiéndoles otorgar un valor en la posición adecuada en relación a cada columna. Esto incluye especificar explícitamente los campos NULL y vacíos que no queremos informar.

Además, en el caso de que tengamos campos auto incrementales con la propiedad IDENTITY, no podremos utilizar dicha opción, ya que el sistema obliga a especificar la columna a la que hace referencia la propiedad, no siendo posible establecerse con la posición. Por ello no podemos utilizar este INSERT INTO para añadir un nuevo registro a nuestras tablas de ejemplos Clientes y Pedidos, ya que ambas están declaradas con campos con propiedad IDENTITY.

Aunque el siguiente INSERT INTO fallará por la definición de nuestro modelo, ejemplifica sintácticamente como se definen este tipo de inserciones:

INSERT INTO Clientes
VALUES (6, 'Fernando', 'Fernandez Rodriguez', '', NULL);

Romper propiedad IDENTITY

Es posible romper la propiedad IDENTITY, para indicar un valor específico a la columna que afecta, saliéndose de la secuencia auto incremental predeterminada.

SET IDENTITY_INSERT Clientes ON;

Esta sentencia nos permite especificar el valor deseado al campo idClientes:

INSERT INTO Clientes
    (idClientes,
     nombre,
     apellidos,
     direccion)
VALUES
    (15,
    'Federico',
    'Sanz García',
    'Calle Alcalá 55');

Para volver a activar la propiedad IDENTITY predeterminada basta con ejecutar esta sentencia:

SET IDENTITY_INSERT Clientes OFF;

De esta manera el siguiente INSERT INTO sobre la tabla Clientes tomará el valor idClientes = 15 como valor de referencia para auto incrementarse en uno en el siguiente registro.

Errores comunes

Es muy importante a la hora de realizar cualquier INSERT INTO, conocer muy bien como ha sido declarada la tabla junto a sus propiedades y restricciones para evitar errores fácilmente prevenibles.

Propiedades

INSERT INTO Clientes
    (nombre,
     direccion)
VALUES
    ('Marisa',
    'C/ Virgen de Fátima 7');

No se puede insertar el valor NULL en la columna ‘apellidos’, tabla ‘tienda.dbo.Clientes’. La columna no admite valores NULL. Error de INSERT

Como el propio mensaje de la consola indica explícitamente, en nuestra declaración de la tabla Clientes, tanto nombre y apellidos están declarados con la propiedad NOT NULL, por ende, debemos asegurarnos otorgarles algún valor.

Es importante hacer aquí una aclaración respecto a los campos vacíos y NULL, ya que es un hecho que muchas veces hace llevar a error tanto en el trabajo de base de datos como en otros lenguajes de programación. Y es que, debemos recordar que no son sinónimos. En resumen, un campo NULL es un campo no declarado, el cual no tiene un espacio de memoria asignado, mientras que un campo vacío si apunta a un área de memoria especifica, declarándola vacía.

Restricciones

Es muy importante el control de los datos, especialmente en las tablas que tienen definidas claves Foreign Key para relacionarse a otras tablas. Y es que, al ejecutar un INSERT INTO, no solo debemos atender al tipo de dato y propiedades para escribir la sentencia, si no también habrá que dedicar una especial atención a las restricciones de la tabla y la coherencia de los datos.

INSERT INTO  Pedidos
    (producto,
    descripcionProducto,
    precio,
    numeroProductos,
    idClientes)
VALUES
    ('Play Station 4',
    'VideoConsola Sony',
    '549.95',
    15,
    12);

Instrucción INSERT en conflicto con la restricción FOREIGN KEY 'fk_clientes_pedido'. El conflicto ha aparecido en la base de datos 'tienda', tabla 'dbo.Clientes', column 'idClientes'.

Este error es debido a que no existe en la tabla clientes un registro cuyo idClientes sea 12, lo que se traduce en que estemos intentando relacionar un producto a un cliente inexistente en el sistema. Este tipo de error junto a los errores de formato en los tipos de datos, es muy común y recurrente en los primeros pasos en el manejo de bases de datos relacionales, y es por ello que instamos nuevamente a subrayar la importancia de revisión de los datos que manejamos.