bloggers bloggers

Marco Napolitano
Messaggi: 79
Stelle: 0
Data: 17/02/22
Jader Jed Francia
Messaggi: 63
Stelle: 0
Data: 18/02/21
Paolo Gambetti
Messaggi: 2
Stelle: 0
Data: 11/11/19
Katia Pazzi
Messaggi: 1
Stelle: 0
Data: 27/06/19
Ezio Lombardi
Messaggi: 11
Stelle: 0
Data: 10/04/18
Chiara Mambretti
Messaggi: 25
Stelle: 0
Data: 27/02/17
Serena Traversi
Messaggi: 3
Stelle: 0
Data: 21/07/16
Francesco Falanga
Messaggi: 8
Stelle: 0
Data: 14/06/16
Antonio Musarra
Messaggi: 2
Stelle: 0
Data: 18/11/13
Simone Celli Marchi
Messaggi: 6
Stelle: 0
Data: 09/07/13
Indietro

Sistemazione di un seriale su postgres

Quando usiamo Postgresql, utilizziamo i campi di tipo serial come primary key.

Ogni volta che viene poi creata una entità sul database viene recuperato l'id generato e settato sull'oggetto che la rappresenta.
Di seguito il codice che fa' questa cosa:

< ... omissis codice della insert ... >
i = 1;
// Con questa stored cerchiamo di leggere il nome del seriale da invocare
ps = conn.prepareStatement("select pg_get_serial_sequence(?, ?)");
ps.setString(i++, "public.socio");
ps.setString(i++, "id");
ResultSet rs = ps.executeQuery();
String sequenceName = "";
if (rs.next())
sequenceName = rs.getString(1);


i = 1;
// Con questa chiamata chiediamo al seriale l'id generato per l'oggetto appena creato;

// lo settiamo sull'entita' e lo ritorniamo.
ps = conn.prepareStatement("select currval(?)");
ps.setString(i++, sequenceName);
rs = ps.executeQuery();
if (rs.next())
bean.setId(rs.getInt(1));
else

throw new SQLException("Errore nel retrive del currval dalla tabella");

Capita a volte, però, per mille motivi, che la chiamata alla stored 'pg_get_serial_sequence' non ritorni correttamente il nome del seriale.

Per sistemare la cosa basta "insegnare" al database quale seriale usare per una data colonna, in questo modo:

1) guardare, dalla shell di postgres, qual'e' il seriale che si ha sulla tabella per la chiave primaria interessata

myDb=# \d socio
Table "public.socio"
Column | Type | Modifiers
--------------+---------+-----------------------------------------------------
id | integer | not null default nextval('socio_id_seq1'::regclass)
...

In questo caso, il seriale è 'socio_id_seq1'.

2) istruire Postgresql perchè sappia che il seriale per quella tabella è quello che vogliamo noi:

alter sequence socio_id_seq1 owned by socio.id;

dove:
- socio_id_seq1 è il nome del seriale
- socio.id è la tabella.campo della chiave primaria

Ed il gioco è fatto! :)

Precedente
Commenti
Nessun commento. Vuoi essere il primo.