Databases

T02-003- Borrado de registros.

Enunciado

En el caso de que alguno de los registros que queremos eliminar esté siendo referenciado por algún otro registro de otra tabla con la que exista una relación, la sentencia DELETE mostrará un error que impedirá que se lleve a cabo esa senencia.

Ejemplo

La siguiente sentencia permite eliminar el país con identificador 'AR':

DELETE FROM countries
WHERE COUNTRY_ID = 'AR';

1 row(s) deleted.

Como podemos observar, la sentencia se ejecuta sin error.

Ahora bien, si quisiéramos eliminar el país cuyo identificador fuera el 'IT':

DELETE FROM countries
WHERE COUNTRY_ID = 'IT';

ORA-02292: integrity constraint (LOC_C_ID_FK) violated - child record found ORA-06512

Eso quiere decir que existen direcciones relacionadas con ese país, por lo que no se permite el borrado de dicho país.

Para poder eliminar cualquier país que tenga una dirección relacionada, en el caso de que fuera estrictamente necesario, primero deberíamos eliminar las referencias de las direcciones a ese país:

UPDATE locations
SET COUNTRY_ID = NULL
WHERE COUNTRY_ID = 'IT';

2 row(s) updated.

DELETE FROM countries
WHERE COUNTRY_ID = 'IT';

1 row(s) deleted.

Podemos comprobar como, al haber eliminado las referencias a Italia, se nos ha permitido borrar dicho país.

Ejercicio

Elimina el trabajo 'ST_MAN'. En el caso de que exista algún empleado que actualmente esté realizando ese trabajo o que, según la tabla job_history, lo haya realizado en alguna ocasión, asígnale previamente el trabajo con 'ST_CLERK'.

Tipo

DML

Solución


												
UPDATE HR.employees SET JOB_ID = 'ST_CLERK' WHERE JOB_ID = 'ST_MAN'; UPDATE HR.job_history SET JOB_ID = 'ST_CLERK' WHERE JOB_ID = 'ST_MAN'; DELETE FROM HR.jobs WHERE JOB_ID = 'ST_MAN';

Prueba


											
SELECT EMPLOYEE_ID, JOB_ID, START_DATE FROM HR.job_history WHERE JOB_ID = 'ST_CLERK' UNION SELECT EMPLOYEE_ID, JOB_ID, HIRE_DATE FROM HR.employees WHERE JOB_ID = 'ST_CLERK'

Librerías (Onfly databases)