web-dev-qa-db-ja.com

PostgreSQLのINSERTまたはUPDATEの影響を受けるレコードのカウントを取得します

PostgreSQL 8/9用のデータベースドライバーは、INSERTまたはUPDATEの実行時に影響を受けるレコードのカウントを返しません。

PostgreSQLは、非標準の構文 " [〜#〜] returning [〜#〜] "を提供していますが、これは適切な回避策のようです。しかし、構文は何でしょうか?この例はレコードのIDを返しますが、カウントが必要です。

ディストリビューターへの挿入(did、dname)値(デフォルト、「XYZウィジェット」)RETURNING did;

44
Un Homme

私はこの質問がoooolllllldであり、私の解決策は間違いなく過度に複雑であることを知っていますが、それは私のお気に入りの解決策です!

とにかく、私は同じことをしなければならず、次のように動作させました:

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

最近の1つは、PostgreSQLのWITH句に恋愛ソネットを書くことです。

64
mercurial

私はマイレンに同意します、あなたのドライバーはあなたのためにこれをするべきです。どのドライバーをどの言語で使用していますか?しかし、plpgsqlを使用している場合は、GET DIAGNOSTICS my_var = ROW_COUNT;を使用できます。

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

22
Scott Bailey

どうぞ ROW_COUNTこのコードで更新または挿入した後:

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

あなたが質問からどのように声明を呼んでいるかは明らかではありません。 JDBCのようなものを使用していると仮定すると、更新ではなくクエリとして呼び出すことができます。 JDBCから executeQuery

指定されたSQLステートメントを実行し、単一のResultSetオブジェクトを返します。

したがって、これは、SELECTINSERT ... RETURNINGなどのクエリ結果を返すステートメントを実行する場合に適しています。データベースを更新していて、影響を受けたタプルの数を知りたい場合は、 executeUpdate を使用する必要があります。

(1)SQLデータ操作言語(DML)ステートメントの行カウント、または(2)何も返さないSQLステートメントの0

0
beldaz