2010-10-27 12 views
31

Sterownik bazy danych dla PostgreSQL 8/9 nie zwraca liczby rekordów, na które ma wpływ wykonanie INSERT lub UPDATE.Uzyskaj liczbę rekordów, których dotyczy INSERT lub UPDATE w PostgreSQL

PostgreSQL oferuje niestandardową składnię "RETURNING", która wydaje się dobrym rozwiązaniem. Ale jaka może być składnia? Przykład zwraca identyfikator rekordu, ale potrzebuję zliczenia.

INSERT INTO dystrybutorów (tak, dname) wartości (domyślnie: 'XYZ Widgets') powrocie zrobił;

+1

Wiem, że to nie brzmi zbyt dobrze, ale musisz znaleźć lepsze sterowniki lub zaktualizować swoje obecne (rozwiązanie OMG Kuce wysłali prace tylko w PL/kod pgSQL). –

+0

MySQL automatycznie wyprowadza wiersze dopasowane kontra wiersze, których dotyczy aktualizacja, szkoda, że ​​sterownik psql nie może zrobić tego samego. – EoghanM

+0

Nie próbowałem tego .. ale robi 'WSTAW NA dystrybutorów (did, dname) WARTOŚCI (DEFAULT, 'XYZ Widgets') ZWRÓCENIE 1;' działa? – Jus12

Odpowiedz

46

Wiem, że to pytanie jest oooolllllld i moje rozwiązanie jest chyba zbyt skomplikowane, ale to mój ulubiony rodzaj rozwiązanie!

Zresztą musiałem zrobić to samo i mam to działa tak:

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

Jeden z tych dni, naprawdę muszę dostać się do napisania sonet miłosny do PostgreSQL jest z klauzulą ​​...

+8

Bądź na bieżąco z tym swoim sonetem miłości :) –

0

Z twojego pytania nie wynika jednoznacznie, jak nazywasz to oświadczenie. Zakładając, że używasz czegoś takiego jak JDBC, możesz nazwać to raczej zapytaniem niż aktualizacją. Od JDBC za executeQuery:

Wykonuje daną instrukcję SQL, która zwraca jedną Resultset obiekt.

Jest zatem kiedy wykonać instrukcję, która zwraca jakieś wyniki kwerendy, takie jak SELECT lub INSERT ... RETURNING. Jeśli wykonujesz aktualizację bazy danych, a następnie chce wiedzieć, ilu krotki zostały naruszone, trzeba użyć executeUpdate która zwraca:

albo (1) liczyć wiersz dotyczący danych SQL Manipulation Language (DML) oświadczenia lub (2) 0 dla instrukcji SQL, które nic nie zwracają:

Powiązane problemy