Il giorno 25/ott/2010, alle ore 10.45, Matteo Mattsteel Vitturi ha scritto:

> Ciao Marco.
> Vedo un'errore di fondo nell'uso del database, di qualunque marca esso sia.
> 
> In pratica stai tentando di modificare l'id della chiave primaria della 
> tabella nazioni "contemporaneamente" al corrispettivo id di chiave esterna 
> della tabella clienti.
> Semplicemente, non puoi farlo e il problema dipende dal fatto che esiste un 
> legame di foreing-key tra le due tabelle.
> Dovresti fare così:
> 1. inserire in tabella nazioni la riga con il nuovo id di chiave primaria
> 2. sganciare la chiave esterna della tabella clientiin modo che non punti più 
> alla vecchia chiave primaria e punti alla nuova chiave primaria.
> 3. (tentare di) cancellare la riga della vecchia chiave primaria. Dico 
> "tentare" perché potresti non riuscirci in quanto potresti aver dimenticato 
> di sganciare una riga di clienti.
> 
> L'alternativa potrebbe essere quella di disabilitare per un momento il 
> vincolo di foreign-key, effettuare i due update (come dici tu nel tuo 
> pezzetto di codice) ed infine riattivare la foreign-key... e qui potresti non 
> riuscirci... perché è successo qualcosa nel frattempo.
> 
> Per inciso, con SQLite non avresti il problema in quanto le foreign-key sono 
> sì dichiarabili ma non vengono imposte (enforced) al database.
> 
> Saluti.

Forse la cosa può essere risolta anche usando nella dichiarazione della table 
col la clausola
ON UPDATE CASCADE  
(http://www.postgresql.org/docs/8.4/interactive/sql-createtable.html)

nella stessa pagina trovi anche le indicazioni per l'uso di
[ DEFERRABLE | NOT DEFERRABLE ] [ INITIALLY DEFERRED | INITIALLY IMMEDIATE ]

che è molto comodo per procrastinare il controllo dell'integrità referenziale 
alla chiusura della transazione.

Ciao
G


_______________________________________________
Python mailing list
Python@lists.python.it
http://lists.python.it/mailman/listinfo/python

Rispondere a