it-swarm.com.de

Ermitteln Sie die Anzahl der Datensätze, die von INSERT oder UPDATE in PostgreSQL betroffen sind

Mein Datenbanktreiber für PostgreSQL 8/9 gibt bei der Ausführung von INSERT oder UPDATE keine Anzahl der betroffenen Datensätze zurück. 

PostgreSQL bietet die nicht-Standardsyntax " RETURNING " an, was eine gute Lösung darstellt. Aber wie könnte die Syntax aussehen? Das Beispiel gibt die ID eines Datensatzes zurück, aber ich brauche eine Zählung.

INSERT INTO-Verteiler (did, dname) VALUES (DEFAULT, 'XYZ Widgets') RETURNING tat;

41
Un Homme

Ich weiß, dass diese Frage oooolllllld ist und meine Lösung ist wahrscheinlich zu komplex, aber das ist meine Lieblingslösung!

Jedenfalls musste ich dasselbe tun und habe es so funktionieren lassen:

-- 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;

Eines Tages muss ich wirklich ein Liebes-Sonett für die WITH-Klausel von PostgreSQL schreiben ...

55
mercurial

Ich stimme zu, Milen, Ihr Fahrer sollte dies für Sie tun. Welchen Treiber verwenden Sie und für welche Sprache? Wenn Sie jedoch plpgsql verwenden, können Sie GET DIAGNOSTICS verwenden. My_var = ROW_COUNT;

http://www.postgresql.org/docs/current/static/plpgsql-statements.html

18
Scott Bailey

Sie können nach dem Update ROW_COUNT nehmen oder mit diesem Code einfügen:

insert into distributors (did, dname) values (DEFAULT, 'XYZ Widgets');
get diagnostics v_cnt = row_count;
2
Igor Cova

Aus Ihrer Frage ist nicht klar, wie Sie die Aussage aufrufen. Angenommen, Sie verwenden etwas wie JDBC, nennen Sie es möglicherweise eher als Abfrage als als Update. Aus JDBCs executeQuery :

Führt die angegebene SQL-Anweisung aus, die ein einzelnes ResultSet .__ zurückgibt. Objekt.

Dies ist daher sinnvoll, wenn Sie eine Anweisung ausführen, die einige Abfrageergebnisse zurückgibt, z. B. SELECT oder INSERT ... RETURNING. Wenn Sie ein Update der Datenbank durchführen und wissen möchten, wie viele Tupel betroffen waren, müssen Sie executeUpdate verwenden, das Folgendes zurückgibt:

entweder (1) die Zeilenanzahl für SQL Data Manipulation Language (DML) Anweisungen oder (2) 0 für SQL-Anweisungen, die nichts zurückgeben

0
beldaz