2012-03-09 8 views
12

Invece di eliminare la riga secondaria e quindi scrivere un'altra istruzione sql per eliminare la riga padre, volevo utilizzare una istruzione che eseguisse entrambe le operazioni. Cordiali saluti: usiamo il database Oracle.Eliminare un figlio e una riga padre con uno script SQL

Aggiornamento: Non ho il privilegio di fare DELETE su Cascade

+0

usa DELETE ON CASCADE nel tuo vincolo di chiave esterna .. – Teja

risposta

12

Definire le chiavi esterne con cascading deletes. Quindi devi solo cancellare la riga "genitore".

+1

Beh, non ho il privilegio di farlo. – WowBow

+2

@WowBow - Allora hai bisogno di due istruzioni 'DELETE' – Lamak

+1

Chiedi al tuo DBA di farlo ... – Teja

1

Se si vuole sempre di eliminare i bambini quando si elimina una riga padre, è possibile dichiarare il vincolo di chiave esterna in modo che Oracle non il bambino eliminare automaticamente

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) 
); 

per esempio, dichiarare una tabella padre e una tabella figlio e elimina automaticamente le righe figlio quando si elimina la riga padre. Se non vuoi che quel tipo di cosa venga applicata automaticamente o non ti piace la complessità che viene aggiunta quando le cose accadono "automagicamente" in background, probabilmente sei bloccato a utilizzare più istruzioni DELETE.

+0

Grazie per il tuo aiuto. Tuttavia, non ho il privilegio di creare tabelle o di apportare modifiche a ON DELETE CASCADE. La tabella ha già migliaia di record. Quindi ho fatto due dichiarazioni sql. – WowBow

0

Un altro (modo noioso, abbiamo questo in un database che, per ragioni sconosciute, non usa le chiavi esterne come vincoli - si si) per fare questo sarebbe creare un trigger dopo (o prima) cancellare.

Dovrai scrivere un'altra query di eliminazione, ma solo nel trigger.

Ma se non si può mettere in cascata eliminare, non sono sicuro che è possibile aggiungere trigger ...

1

È solo può fare male - vale a dire, utilizzando i trigger.

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 
) 

ATTENZIONE! Cancellerà solo dove esistono entrambe le righe padre e figlio. NON eliminerà i genitori senza figli

Problemi correlati