2010-02-12 22 views
19

Estoy buscando una forma de devolver el número de filas afectadas por una cláusula DELETE en PostgreSQL. El documentation establece eso;¿Cómo obtener el número de filas eliminadas en PostgreSQL?

Al finalizar con éxito, un comando Eliminar devuelve una etiqueta de comando de la forma

recuento BORRAR

El recuento es el número de filas eliminados. Si count es 0, no hay filas que coincidan con la condición (esto no es considerado un error).

Si el comando DELETE contiene una cláusula DEVOLUCIÓN , el resultado será similar a la de una instrucción SELECT que contiene las columnas y valores definido en la lista de vuelta, calculado en la fila (s) borrado El comando.

Pero estoy teniendo problemas para encontrar un buen ejemplo de ello. ¿Alguien puede ayudarme con esto, , cómo puedo saber cuántas filas se eliminaron?


EDIT: acepté solución de Milen, pero quería presentar una alternativa que he encontrado más tarde. Se puede encontrar en here, explicado en 38.5.5. Obteniendo el estado del resultado title.

+0

Preferencia por lenguaje de programación? Perl, PHP, Python, C, Klingon? – Paul

+0

El lenguaje es Java –

+0

Muchas gracias. Su enlace fue muy útil – jny

Respuesta

-1

Necesita la función PQcmdTuples de libpq. Que en PHP, por ejemplo, se envuelve como pg_affected_rows.

+0

Lo investigaré mañana, gracias por la respuesta –

4

Esto debería ser simple en Java.

Statement stmt = connection.createStatement(); 
int rowsAffected = stmt.executeUpdate("delete from your_table"); 
System.out.println("deleted: " + rowsAffected); 

Ver java.sql.Statement.

+1

Esta pregunta no tiene nada que ver con java .... – Nate

+4

@Nate, en el segundo comentario sobre la pregunta, el OP dice: "El idioma es Java." – cope360

+0

esta debería ser la respuesta aceptada – Tom

2

en Python utilizando psycopg2, se puede usar el atributo rowcount. A continuación se muestra un ejemplo para averiguar cómo se han eliminado muchas filas ...

cur = connection.cursor() 
try: 
    cur.execute("DELETE FROM table WHERE col1 = %s", (value,)) 
    connection.commit() 
    count = cur.rowcount 
    cur.close() 
    print("A total of %s rows were deleted." % count) 
except: 
    connection.rollback() 
    print("An error as occurred, No rows were deleted") 
28

Usted puede utilizar RETURNING cláusula:

DELETE FROM table WHERE condition IS TRUE RETURNING *; 

Después de eso sólo hay que comprobar el número de filas devueltas. Puede optimizar con CTE:

WITH deleted AS (DELETE FROM table WHERE condition IS TRUE RETURNING *) SELECT count(*) FROM deleted; 

Esto debería devolver sólo el número de filas eliminadas.

+1

Creo que esto debería marcarse como aceptado. – MaNKuR

+1

¡Esto funciona sin una extensión! Definitivamente debe ser la respuesta aceptada: D – Alfabravo

1

GET DIAGNOSTICS se utiliza para mostrar el número de registros modificados/eliminados.

Código de ejemplo

CREATE OR REPLACE FUNCTION fnName() 
    RETURNS void AS 
$BODY$ 
     declare 
     count numeric; 
     begin 
       count := 0; 
      LOOP 
      -- condition here update or delete; 
      GET DIAGNOSTICS count = ROW_COUNT; 
      raise notice 'Value: %', count; 
      end loop; 
     end; 
$BODY$a 
Cuestiones relacionadas