<html>
<head>
<style><!--
.hmmessage P
{
margin:0px;
padding:0px
}
body.hmmessage
{
font-size: 10pt;
font-family:Tahoma
}
--></style>
</head>
<body class='hmmessage'>
Ammetto candidamente la mia ignoranza di PostgreSQL...<br><br>&gt; From: giovanni.porcari - Mon, 25 Oct 2010 12:02:45 <br>&gt; <br>&gt; Il giorno 25/ott/2010, alle ore 10.45, Matteo Mattsteel Vitturi ha scritto:<br>&gt; <br>&gt; &gt; Ciao Marco.<br>&gt; &gt; Vedo un'errore di fondo nell'uso del database, di qualunque marca esso sia.<br>&gt; &gt; <br>&gt; &gt; In pratica stai tentando di modificare l'id della chiave primaria della tabella nazioni "contemporaneamente" al corrispettivo id di chiave esterna della tabella clienti.<br>&gt; &gt; Semplicemente, non puoi farlo e il problema dipende dal fatto che esiste un legame di foreing-key tra le due tabelle.<br>&gt; &gt; Dovresti fare così:<br>&gt; &gt; 1. inserire in tabella nazioni la riga con il nuovo id di chiave primaria<br>&gt; &gt; 2. sganciare la chiave esterna della tabella clientiin modo che non punti più alla vecchia chiave primaria e punti alla nuova chiave primaria.<br>&gt; &gt; 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.<br>&gt; &gt; <br>&gt; &gt; 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.<br>&gt; &gt; <br>&gt; &gt; Per inciso, con SQLite non avresti il problema in quanto le foreign-key sono sì dichiarabili ma non vengono imposte (enforced) al database.<br>&gt; &gt; <br>&gt; &gt; Saluti.<br>&gt; <br>&gt; Forse la cosa può essere risolta anche usando nella dichiarazione della table col la clausola<br>&gt; ON UPDATE CASCADE  (http://www.postgresql.org/docs/8.4/interactive/sql-createtable.html)<br>&gt; <br>&gt; nella stessa pagina trovi anche le indicazioni per l'uso di<br>&gt; [ DEFERRABLE | NOT DEFERRABLE ] [ INITIALLY DEFERRED | INITIALLY IMMEDIATE ]<br>&gt; <br>&gt; che è molto comodo per procrastinare il controllo dell'integrità referenziale <br>&gt; alla chiusura della transazione.<br>&gt; <br>&gt; Ciao<br>&gt; G<br><br>                                               </body>
</html>