2012-03-09 12 views

Respuesta

12

Definir sus claves externas con cascading deletes. Entonces solo necesita borrar la fila "principal".

+1

Bueno, no tengo el privilegio de hacerlo. – WowBow

+2

@WowBow - Entonces necesita dos declaraciones 'DELETE' – Lamak

+1

Pídale a su DBA que lo haga ... – Teja

1

Si siempre quiere eliminar a los niños cuando se elimina una fila principal, se puede declarar la restricción de clave externa para que Oracle no borrar el niño, por ejemplo, declarará una tabla primaria automáticamente

create table parent (
    parentID number primary key, 
    parentData varchar2(100) 
); 

create table child (
    childID number primary key, 
    parentID number references parent(parentID) on delete cascade, 
    childData varchar2(100) 
); 

y una tabla secundaria y elimina automáticamente las filas secundarias cuando elimina la fila principal. Si no quiere que ese tipo de cosas se apliquen automáticamente o si no le gusta la complejidad que se agrega cuando las cosas suceden "automágicamente" en el fondo, probablemente esté atascado con el uso de múltiples declaraciones DELETE.

+0

Gracias por su ayuda. Sin embargo, no tengo el privilegio de crear tablas o hacer un cambio a ON DELETE CASCADE. La tabla ya tiene miles de registros. Así que hice dos declaraciones sql. – WowBow

0

Otra (manera aburrida, tenemos esto en una base de datos que, por razones desconocidas, no usan claves foráneas como restricciones - sí sí) para hacer esto sería crear un disparador después (o antes) de eliminar.

Tendrá que escribir otra consulta de eliminación, pero solo en el desencadenador.

Pero si no se puede poner en cascada eliminar, no estoy seguro de que puede agregar disparadores ...

1

Sólo puede hacerlo mal - es decir, el uso de los factores desencadenantes.

create table parent 
(pid number, 
    constraint parent_pk 
    primary key (pid) 
    using index 
); 

create table child 
    (cid number, 
    pid number, 
    constraint child_pk 
    primary key(cid) 
    using index, 
    constraint child_fk 
    foreign key (pid) 
    references parent (pid) 
); 

create index child_fk on child (pid); 

create trigger fake_delete_cascade 
before delete on parent 
for each row 
begin 
    delete from child where pid = :old.pid; 
end; 
/

insert into parent values (1); 
insert into child values (1,1); 
commit; 
select count(*) from child; 
delete from parent where pid = 1; 
select count(*) from child; 
3
delete from 
(
select * from parent join child using (id) 
where id = 1 
) 

ADVERTENCIA! Solo eliminará donde existan las filas padre Y hijo. NO eliminará padres sin hijos

Cuestiones relacionadas