2010-10-27 11 views
31

Il driver del mio database per PostgreSQL 8/9 non restituisce un conteggio dei record interessati durante l'esecuzione di INSERT o UPDATE.Ottieni il conteggio dei record interessati da INSERT o UPDATE in PostgreSQL

PostgreSQL offre la sintassi non standard "RETURNING" che sembra una buona soluzione. Ma quale potrebbe essere la sintassi? L'esempio restituisce l'ID di un record, ma ho bisogno di un conteggio.

INSERT INTO distributori (fatto, dname) VALORI (DEFAULT, 'XYZ Widgets') Tornando fatto;

+1

so che non suona utile, ma bisogna trovare i driver migliori o aggiornamento per i vostri attuali (la soluzione OMG Ponies hanno inviato lavori solo in PL/codice pgSQL). –

+0

MySQL restituisce automaticamente le righe corrispondenti alle righe interessate per gli aggiornamenti, peccato che il driver psql non possa fare lo stesso. – EoghanM

+0

Non provato questo .. ma fa 'INSERT INTO distributori (did, dname) VALORI (DEFAULT,' XYZ Widgets ') RESTITUISCE 1; 'lavoro? – Jus12

risposta

46

So che questa domanda è oooolllllld e la mia soluzione è forse eccessivamente complesso, ma questo è il mio genere preferito di soluzione!

Comunque, ho dovuto fare la stessa cosa e ottenuto che funziona in questo modo:

-- Get count from INSERT 
WITH rows AS (
    INSERT INTO distributors 
     (did, dname) 
    VALUES 
     (DEFAULT, 'XYZ Widgets'), 
     (DEFAULT, 'ABC Widgets') 
    RETURNING 1 
) 
SELECT count(*) FROM rows; 

-- Get count from UPDATE 
WITH rows AS (
    UPDATE distributors 
    SET dname = 'JKL Widgets' 
    WHERE did <= 10 
    RETURNING 1 
) 
SELECT count(*) FROM rows; 

Uno di questi giorni devo proprio andare in giro a scrivere un sonetto d'amore a PostgreSQL di clausola WITH ...

+8

Tienici aggiornati su quel tuo sonetto d'amore :) –

0

Non è chiaro dalla tua domanda come stai chiamando la dichiarazione. Supponendo che stai usando qualcosa come JDBC potresti chiamarlo come una query piuttosto che un aggiornamento. Da executeQuery di JDBC:

esegue il dato istruzione SQL, che restituisce un singolo ResultSet oggetto.

Questo è pertanto opportuno quando si esegue un'istruzione che restituisce alcuni risultati della query, come SELECT o INSERT ... RETURNING. Se si stanno facendo un aggiornamento al database e poi volete sapere quante tuple sono stati colpiti, è necessario utilizzare executeUpdate che restituisce:

o (1) il numero di righe per SQL Data Manipulation Language (DML) privacy o (2) 0 per le istruzioni SQL che nulla restituiscono

Problemi correlati