PDA

View Full Version : [SQL] aiuto


Tony Hak
05-01-2010, 15:56
buonasera a tutti ..

ho il seguente comando sql : update corsi_di_laurea set cod_laurea=600 where cod_laurea=566 . quando lo vado ad eseguire compare il seguente messaggio di errore: "ORA-02292: restrizione di integrità violata (ANGERO.BORSE_ERASMUS_FK) - chiave figlia trovata" in quanto la tabella corsi_di_laurea è collegata alla tabella borse_erasmus tramite chiave esterna cod_laurea. Come posso modificare il valore di cod_laurea ad entrambe le tabelle senza avere errori ? ..grazie

shinya
05-01-2010, 16:27
Premesso che se stai facendo l'update di una chiave primaria c'è qualcosa che non quadra, e che se non è una chiave primaria non capisco perchè sia una foreign key su un'altra tabella, hai alcune opzioni:

1) riconoscere che c'è qualcosa che non va con il design del db
2) fare l'insert della laurea 566 in corsi_di_laurea, aggiornare borse_erasmus dove c'è cod_laurea 600 mettendo 566, cancellare la vecchia cod_laurea 600 da corsi_di_laurea.
Puoi pure farti un trigger, dato che sei su oracle... ma non mi complicherei la vita se non fosse strettamente necessario.

Tony Hak
06-01-2010, 09:12
cod_laurea è la chiave primaria di corsi_di_laurea e viene ereditata da Borse_erasmus ... in quanto il collegamento tra queste due entita' è (1,n) (un corso di laurea bandisce piu' borse erasmus, una borsa erasmus è bandita da un solo corso di laurea) ...

è che deve esserci un modo per modificare sia cod_laurea da corso_di_laurea che da borse_erasmus ....

tomminno
06-01-2010, 19:04
cod_laurea è la chiave primaria di corsi_di_laurea e viene ereditata da Borse_erasmus ... in quanto il collegamento tra queste due entita' è (1,n) (un corso di laurea bandisce piu' borse erasmus, una borsa erasmus è bandita da un solo corso di laurea) ...

è che deve esserci un modo per modificare sia cod_laurea da corso_di_laurea che da borse_erasmus ....

Se devi poterla modificare allora non è una chiave primaria ed è sbagliato il design del database.
Se invece come pare giusto (spero che chi ha fatto il database l'abbia realizzato con un pò di criterio) è chiave primaria per quale motivo stai cercando di modificarla?
Non è che ti basta modificare un'associazione tra corso di laurea e borse erasmus?
Secondo me la cosa migliore è (come già suggerito) inserire un nuovo record con cod_laurea 600 e aggiornare i vecchi riferimenti con il nuovo codice, anche se ancora mi sfugge il motivo per cui devi fare ciò.

I corsi identificati da cod_laurea 600 e 566 sono differenti o rappresentano lo stesso corso? Se rappresentano lo stesso corso perchè mai cambiarne l'identificativo? Se sono differenti allora è giusto che siano due record differenti e qualora il corso 566 non sia più attivo ma sia stato sostituito dal corso 600, allora basta aggiornare le correlazioni, una volta inserito il nuovo corso.