복붙노트

[SQL] PostgreSQL을에 INSERT 또는 UPDATE에 의해 영향을받는 레코드 수를 가져옵니다

SQL

PostgreSQL을에 INSERT 또는 UPDATE에 의해 영향을받는 레코드 수를 가져옵니다

PostgreSQL의 8/9에 대한 나의 데이터베이스 드라이버는 INSERT 또는 UPDATE를 실행할 때 영향을받는 레코드 수를 반환하지 않습니다.

PostgreSQL은 좋은 해결 방법처럼 보인다 비 표준 구문 "RETURNING"를 제공합니다. 그러나 구문이 될 수 있는가? 예는 레코드의 ID를 반환하지만 나는 카운트가 필요합니다.

해결법

  1. ==============================

    1.이 질문은 oooolllllld하고 내 솔루션은 틀림없이 지나치게 복잡 알고 있지만, 그 솔루션의 내가 좋아하는 종류입니다!

    이 질문은 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;
    

    정말 PostgreSQL을의 WITH 절에 사랑의 소네트를 작성 주위에 가야 요즘 중 하나 ...

  2. ==============================

    2.나는 Milen / 드라이버가 당신을 위해이 작업을 수행해야 승 동의합니다. 어떤 드라이버 당신은 어떤 언어를 사용하고 있습니까? 당신이 plpgsql를 사용하는 경우, 당신은 GET DIAGNOSTICS my_var = ROW_COUNT을 사용할 수 있습니다;

    나는 Milen / 드라이버가 당신을 위해이 작업을 수행해야 승 동의합니다. 어떤 드라이버 당신은 어떤 언어를 사용하고 있습니까? 당신이 plpgsql를 사용하는 경우, 당신은 GET DIAGNOSTICS my_var = ROW_COUNT을 사용할 수 있습니다;

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

  3. ==============================

    3.이 코드를 갱신 또는 삽입 한 후 ROW_COUNT를 취할 수 있습니다 :

    이 코드를 갱신 또는 삽입 한 후 ROW_COUNT를 취할 수 있습니다 :

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

    4.당신이 문을 호출하는 방법 질문에서 명확하지 않다. 당신이 JDBC 같은 것을 사용하는 가정 당신은 쿼리가 아닌 업데이트로를 호출 할 수있다. JDBC의하는 executeQuery에서 :

    당신이 문을 호출하는 방법 질문에서 명확하지 않다. 당신이 JDBC 같은 것을 사용하는 가정 당신은 쿼리가 아닌 업데이트로를 호출 할 수있다. JDBC의하는 executeQuery에서 :

    당신은 SELECT 또는 INSERT ... 등의 반환 일부 쿼리 결과는, RETURNING하는 문을 실행할 경우에 따라서 적절하다. 데이터베이스에 대한 업데이트를 제작하고 영향을받은 많은 튜플 알고 싶은 경우는 반환 executeUpdate의를 사용해야합니다 :

  5. ==============================

    5.당신은 거래에서 쿼리를 포장 할 수 그것을 당신이 ROLLBACK 전에 당신에게 수를 표시하거나 COMMIT한다. 예:

    당신은 거래에서 쿼리를 포장 할 수 그것을 당신이 ROLLBACK 전에 당신에게 수를 표시하거나 COMMIT한다. 예:

    BEGIN TRANSACTION;
    
    INSERT .... ;
    
    ROLLBACK TRANSACTION;
    

    위의 첫 두 줄을 실행하면, 그것은 당신에게 수를 제공해야합니다. 그런 다음 ROLLBACK (취소) 삽입하면 영향을받는 행의 수는 당신이 기대했던 아니라는 것을 찾을 수 있는지. 당신이 INSERT가 올바른지 만족하는 경우에, 당신은 같은 일을 실행할 수 있지만 트랜잭션을 COMMIT과 3 호선을 대체 할 수 ;.

    중요 사항 : 당신이 어떤 BEGIN TRANSACTION을 실행 한 후, 당신이 중 하나를 수행해야합니다 ROLLBACK; 또는 COMMIT; 트랜잭션은 다른 트랜잭션이 프로덕션 환경에서 실행하는 경우, 전체 시스템 속도를 느리게하거나 무력화 할 수있는 잠금을 생성합니다.

  6. from https://stackoverflow.com/questions/4038616/get-count-of-records-affected-by-insert-or-update-in-postgresql by cc-by-sa and MIT license