Problemi con le ForeignKey in Oracle A volte, nel cancellare un record da una tabella in Oracle si ottiene l'errore ORA-02292. Vediamo come e perché? |
IL PROBLEMA
Vogliamo cancellare un dato record da una data tabella.
DELETE FROM mytablespace.mytable MY
WHERE MY.id = 12;
Nel fare questo, sotto alcune circostanze, si può ottenere il seguente errore Oracle
[Err] ORA-02292: restrizione di integrità violata (mytablespace.FK_myforeignkey) - chiave figlia trovata
Questo errore, ORA-02292, esce fuori perché al record che si vuole cancellare è associata una chiave esterna, il che vuol dire che c'è un record in un'altra tabella che fa riferimento al record che si vuole cancellare. La cancellzione quindi non è ammessa. Bisogna cancellare prima il record che fa riferimento al nostro.
Ma come si fa a sapere quale sia l'altra tabella che fa riferimento alla nostra?
Di solito è sufficiente andare sulla nostra tabella mytable e verificare se questa tabella dichiara delle foreignkey.
Però se la foreignkey che ci crea problemi non è definita nella nostra tabella ma è definita in un'altra tabella come si fa?
Un buon metodo è eseguire la seguente query:
select owner,constraint_name,constraint_type,table_name,r_owner, r_constraint_name
from all_constraints
where constraint_type='R'
and r_constraint_name
in (select constraint_name
from all_constraints
where constraint_type in ('P','U') and table_name='MYTABLE' )
Questa query vi dirà tutto ciò che vi serve!
Ma come si fa a sapere quale sia l'altra tabella che fa riferimento alla nostra?
Di solito è sufficiente andare sulla nostra tabella mytable e verificare se questa tabella dichiara delle foreignkey.
Però se la foreignkey che ci crea problemi non è definita nella nostra tabella ma è definita in un'altra tabella come si fa?
Un buon metodo è eseguire la seguente query:
select owner,constraint_name,constraint_type,table_name,r_owner, r_constraint_name
from all_constraints
where constraint_type='R'
and r_constraint_name
in (select constraint_name
from all_constraints
where constraint_type in ('P','U') and table_name='MYTABLE' )
Questa query vi dirà tutto ciò che vi serve!