Newsgroup: it.comp.software.database
Titolo: postgresql: chiavi primarie e secondarie, inserire record su piu` tabelle contemporaneamente

salve,
ho due tabelle di questo tipo
tabella 1
ID1, cognome, nome
tabella 2
ID2, reparto
ID1 e` chiave primaria, ID2 chiave secondaria relazionata a ID1. Quando
inserisco un record in tabella 1 vorrei inserire anche il
corrispondente in tabella 2; in ID2 vorrei mettere lo stesso ID1 di
tabella 1. Il problema e` che ID1 e` autoincrementale per cui non lo
conosco a priori. E` possibile fare una query che mi unisca le due
tabelle e poi inserire il record nella query? Se si, come si fa? Se no,
come faccio a gestire le due tabelle con la chiave in comune?
Ciao e grazie,
Filippo

 Filippo
Buon lavoro.

 Buon lavoro.
marc.

ops, non ho capito molto. La mia esigenza e` la seguente:
tabella anagrafica
contiene tutti anagrafici delle persone. Ha il campo ID che indntifica
univocamente le persone (risolvo il problema degli omonimi)
tabella 2
questa tabella associa alle persone i servizi che utilizzano:
- ogni riga associa un ID di anagrafica ad un servizio
- ogni persona puo` avere piu` servizi attivi (e quindi piu` righe in
tabella 2)
- ci possono essere persone in anagrafica che non compaioni nella
tabella 2 (persone senza servizi associati)
- non ci possono essere servizi in tabella due senza persona associata
(record di tabella 2 senza riferimento alla persona)
il campo ID della tabella 1 e` definito come chiave primaria e voglio
utilizzarlo anche come ID univoco di persona da associare nella tabella
2 (questo per evitare il gia` citato problemi degli omonimi)
nel caso volessi simultaneamente creare una nuova persona in tabella 1
e assegnarle un servizio, ho bisogno di conoscere il valore di ID di
quella persona da inserire nel campo ID della tabella 2. Come posso
farlo?
Ciao e grazie,
Filippo
il campo ID della tabella 2 (che viene creato automaticamente dal
database ad ogni INSERT in tabella) va` associato a

 Filippo
marc.

il mio problema non e` trovare l'ultimo inserito, ma garantire che sia
quello giusto.
Essendo l'ambiente multiutente, come posso essere sicuro che non
succeda questo:
- aggiungo un record sulla tabella 1
- un altro utente fa la stessa cosa
- faccio una query che mi trovi l'ultimo inserito
- aggiungo l'nformazione sulla tabella 2, sbagliata perche` e` riferita
non al mio INSERT ma a quello dell'altro utente
come posso evitare cio?
Ciao e grazie,
Filippo

 succeda questo:
Apri una sessione (dipende dal linguaggio come viene vista. In Python
hai un cursore), fai l'insert e richiedi al cursore l'ultimo id. Lui ti
tornera` il suo ultimo id, non quello di altri utenti che possono
essersi collegati nel frattempo.
Bye.
-- 
Alessandro Pellizzari

>Apri una sessione (dipende dal linguaggio come viene vista. In Python
e` proprio quello che mi serve! Io uso postgresql con perl, ma non ho
mai sentito nulla di cio`. Mi sono perso qualcosa?
Ciao e grazie,
Filippo

 Non in una relazione 1-1
Casomai, non in un vincolo pk/fk.
Ribadisco ed amplio: l'identificazione corretta delle chiavi permette
a tabelle in database diversi di identificare correttamente la stessa
entità.
O credi che, ad esempio tra amministrazioni diverse di uno stato, ci
sia sempre una connessione attiva per prelevare il valore dell'ultimo
ID inserito in una data tabella, altrimenti non si può fare niente
se una persona si presenta ad uno sportello?
Ciao

 farlo?
Il valore della pk lo devi già sapere, altrimenti come fai a sapere
se hai già inserito una data persona oppure no? Un doppio inserimento
di una PK fa scattare un errore, invece cogli ID puoi inserire la
stessa persona fino all'esaurimento della memoria!!

 quindi procedere con l'inserimento nella tabella in relzione.
Per amor di ragionamento, rispondi a questo:
Se faccio un INSERT di n righe nella tabella1, quanti ID di ritorno
avrei?
(avviso: trappola in agguato) :->

ho risolto il problema con una cosa del tipo
 # avvia la transazione
  $dbh->do('begin');
  # aggiorna contatore id clienti
  $sth = $dbh->prepare("SELECT nextval('contatore_id_clienti')");
  $sth->execute;
  $new_id = ($sth->fetchrow_array)[0];
e poi utilizzo il valore $new_id nelle query successive
  # commit
  $dbh->do('commit');
il tuo discorso e` interessante, cerchero` di capire se avere una
chiave cognome,nome,datanascita e` piu` efficiente che usare un id
univoco.
Ciao e grazie,
Filippo

 mai sentito nulla di cio`. Mi sono perso qualcosa?
Mi spiace, ma non conosco perl.
Postgres lo uso in Python e PHP.
Bye.
-- 
Alessandro Pellizzari

 univoco.
  non sono certo un guru ma credo ti convenga usare il codice fiscale
se hai tutti i dati per calcolarlo

 
   il codice fiscale identifica una sola persona, perche' non
dovrebbe essere univoco? (giusto per curiosita' e cultura personale)

 dovrebbe essere univoco? (giusto per curiosita' e cultura personale)
Il codice fiscale e` univoco solo per l'Italia e solo se hai l'originale
rilasciato dal Ministero delle Finanze.
I codici fiscali calcolati non sono univoci, perche` ci sono collisioni che
vengono risolte, appunto, dal Ministero in fase di assegnazione, cambiando
uno dei caratteri.
Bye.
-- 
Alessandro Pellizzari

 uno dei caratteri.
perfetto, grazie