En los anteriores post hemos visto órdenes del Lenguaje de Definición de Datos (DDL), Create, Drop, Alter Table, Vístas, Índices y secuencias, y por último Sinónimos y pseudoColumnas

Las instrucciones de actualización son aquellas que no devuelven ningún registro, sino que son las encargadas de acciones como añadir, borrar y modificar registros. En este post veremos las órdenes INSERT, DELETE y UPDATE.



Índice

Inserción de registros

La sentencia INSERT nos permite introducir nuevas filas en una tabla de la base de datos. Su sintaxis más simple es:

Insert into  tabla ([<lista_campos>]) Values ([<lista de="de" valores="valores">])

donde tabla representa la tabla a la que queremos añadir el registro y los valores que siguen a la clausula VALUES son los valores que damos a los distintos campos del registro. Si no se especifica la lista de campos, la lista de valores debe seguir el orden de todos los campos de la tabla.

La lista de campos a rellenar se indica si no queremos rellenar todos los campos. Los campos no rellenados explícitamente con la orden INSERT, se rellenan con su valor por defecto (DEFAULT) o bien con NULL si no se indicó valor alguno.

Insert into tabla ([<lista_campos>])
Select .....

En esta segunda sintaxis se permite añadir registros a una tabla obteniéndolos mediante una consulta SELECT. Por supuesto el tipo de los campos y el orden de estos debe coincidir con los de la lista de campos o con los de la tabla destino si estos últimos no se indican.

Ejemplo:

CREATE SEQUENCE SQ_NumFactura START WITH 1 INCREMENT BY 1;

CREATE TABLE MATRICULAS(
    nNumMatr  NUMBER(10) PRIMARY KEY,
    cCodAlu   VARCHAR2(10),
    cNomAlu   VARCHAR2(50),
    dFecIng   DATE DEFAULT SYSDATE
);

INSERT INTO MATRICULAS VALUES (SQ_NumFactura.NEXTVAL,'123','Antonio Lopez', '01/01/2000');

INSERT INTO MATRICULAS(nNumMatr,cCodAlu,cNomAlu) VALUES (SQ_NumFactura.NEXTVAL, '456','Manuel Viedma');

SELECT * FROM MATRICULAS;

SELECT SQ_NumFactura.NEXTVAL FROM DUAL;

INSERT INTO MATRICULAS(nNumMatr,cCodAlu,cNomAlu) VALUES (SQ_NumFactura.NEXTVAL, '789','Cristina Barcelona');

SELECT * FROM MATRICULAS;

Borrado de registros

La sentencia DELETE nos permite borrar filas de una tabla de la base de datos. Su sintaxis más simple es:

Delete [from] tabla [Where <condici>]

La sentencia DELETE es de tipo DML mientras que la sentencia TRUNCATE es de tipo DDL; la diferencia está en dos aspectos:

Una vez que se han eliminado los registros utilizando la sentencia DELETE, no puede deshacer la operación. Si desea saber qué registros se eliminarán, primero examine los resultados de una consulta de selección que utilice el mismo criterio y después ejecute la consulta de borrado. Mantenga copias de seguridad de sus datos en todo momento. Si elimina los registros equivocados podrá recuperarlos desde las copias de seguridad. Hay que tener en mucho cuidado con la restricción de ON DELETE CASCADE.

Modificación de registros

La sentencia UPDATE nos permite modificar filas de una tabla de la base de datos. Su sintaxis más simple es:

Update tabla Set columna1= valor1 [, columna2= valor2, .....] [Where <condici>]

Se modifican las columnas indicadas en el apartado SET con los valores indicados. La cláusula WHERE permite especificar qué registros serán modificados.

Su segundo tipo de sintaxis es:

Update tabla Set columna1= (Sentencia SELECT) [Where <condici>]

Este tipo de actualizaciones sólo son válidas si la Sentencia SELECT devuelve un único valor, que además debe de ser compatible con la columna que se actualiza.

Sentencia MERGE

Este comando sirve para actualizar los valores de los registros de una tabla a partir de valores de registros de otra tabla o consulta. Permite pues combinar los datos de dos tablas a fin de actualizar la primera. Su sintaxis es:

MERGE INTO tabla alias
USING (instrucción SELECT) alias
ON (condición de unión)
WHEN MATCHED THEN
   UPDATE SET col1=valor1 [col2=valor2]
WHEN NOT MATCHED THEN
   INSERT (listaDeColumnas)
   VALUES (listaDeValores)

MERGE compara los registros de ambas tablas según la condición indicada en el apartado ON. Compara cada registro de la tabla con cada registro del SELECT. Los apartados de la sintaxis significan lo siguiente:

Supongamos que poseemos una tabla en la que queremos realizar una lista de localidades con su respectiva provincia. Las localidades están ya rellenadas, nos faltan las provincias. Resulta que tenemos otra tabla llamada clientes en la que tenemos datos de localidades y provincias, gracias a esta tabla podremos rellenar los datos que faltan en la otra.

MERGE INTO localidades l
USING (SELECT * FROM clientes) c
ON (l.localidad=clientes.localidad)
WHEN MATCHED THEN
  UPDATE SET l.provincia=c.provincia
WHEN NOT MATCHED THEN
  INSERT (localidad, provincia)
  VALUES (c.localidad, c.provincia)

La situación se muestra en la ilustración siguiente:

y el resultado después de ejecutar la sentencia MERGE sería:

Siguiente Tema: Consulta de Datos - Cláusula Select