Ecco il codice che funziona:Recupero ID seriale da lotto inserito righe in PostgreSQL
Connection c = ds.getConnection();
c.setAutoCommit(false);
PreparedStatement stmt = c.prepareStatement("INSERT INTO items (name, description) VALUES(?, ?)");
while (!(items = bus.take()).isEmpty()) {
for (Item item : items) {
stmt.setString(1, item.name);
stmt.setString(2, item.description);
stmt.addBatch();
}
stmt.executeBatch();
c.commit();
}
Ma ora ho bisogno di compilare un altro tavolo dove id è una chiave esterna. Se utilizzo INSERT con RETURNING id
, il executeBatch
non riesce con errore "È stato restituito un risultato quando nessuno era previsto".
vedo diversi modi per risolvere questo
- fare inserto individuale piuttosto che l'inserto in batch.
- Sostituisci ID seriale con guid generato dal client.
- Utilizzare una sorta di stored procedure per eseguire l'inserimento batch e restituire un elenco di ID.
dei tre metodi che vedo l'ultimo sembra preservare sia l'efficienza del inserto in batch e restituire gli ID, ma è anche il più complesso per me, come ho mai scritto stored procedure.
C'è un modo migliore per inserire in batch e ottenere gli ID? Non ho problemi ad usare API postgresql piuttosto che jdbc.
In caso contrario, si può abbozzare una tale procedura memorizzata?
Ecco lo schema della tabella:
CREATE UNLOGGED TABLE items
(
id serial,
name character varying(1000),
description character varying(10000)
)
WITH (
OIDS=FALSE
);
Date un'occhiata al metodo di JDBC 'getGeneratedKeys'. Non l'ho verificato specificamente per le connessioni batch, però. –
Che ne dici di popolare entrambe le tabelle contemporaneamente con wCTE? –
@JakubKania - Che cos'è wCTE? Puoi mostrare un esempio? – mark