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