2010-10-27 42 views
31

El controlador de mi base de datos para PostgreSQL 8/9 no devuelve un recuento de los registros afectados al ejecutar INSERT o UPDATE.Obtenga el recuento de los registros afectados por INSERT o UPDATE en PostgreSQL

PostgreSQL ofrece la sintaxis no estándar "RETURNING" que parece una buena solución. Pero, ¿cuál podría ser la sintaxis? El ejemplo devuelve la ID de un registro, pero necesito un conteo.

INSERT INTO distribuidores (DID, dname) VALORES (por defecto, 'XYZ Widgets') Volviendo hizo;

+1

Sé que no parece útil, pero debe buscar mejores controladores o actualizar los actuales (la solución que OMG Ponies ha publicado funciona solo en PL/código pgSQL). –

+0

MySQL genera automáticamente filas coincidentes en comparación con las filas afectadas por las actualizaciones, lástima que el controlador psql no puede hacer lo mismo. – EoghanM

+0

No intenté esto ... pero 'INSERT INTO distribuidores (did, dname) VALUES (PREDETERMINADO, 'XYZ Widgets') VOLVER 1;' ¿funciona? – Jus12

Respuesta

46

Sé que esta pregunta es oooolllllld y mi solución es posiblemente demasiado complejo, pero eso es mi tipo favorito de la solución!

De todos modos, que tenía que hacer lo mismo y tengo trabajo así:

-- 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 de estos días que realmente tiene que moverse a escribir un soneto de amor a PostgreSQL de cláusula WITH ...

+8

Manténganos actualizados en ese soneto de amor suyo :) –

0

No está claro por su pregunta cómo está llamando a la declaración. Suponiendo que está utilizando algo como JDBC, puede llamarlo como una consulta en lugar de una actualización. De executeQuery de JDBC:

ejecuta la sentencia de SQL, que devuelve un único conjunto de resultados objeto.

Ésta es, por tanto, adecuado cuando se ejecuta una sentencia que devuelve algunos resultados de la consulta, como SELECT o INSERT ... RETURNING. Si va a realizar una actualización de la base de datos y luego quiere saber cuántos tuplas se vieron afectados, es necesario utilizar executeUpdate que devuelve:

o bien (1) el número de filas de datos SQL Lenguaje de manipulación (DML) declaraciones o (2) 0 para declaraciones SQL que no devuelven nada

Cuestiones relacionadas