Re: Getting a count from an update

From: Bruno Wolff III <bruno(at)wolff(dot)to>
To: Chandra Sekhar Surapaneni <chandu(at)positivenetworks(dot)net>
Cc: Brian Hurt <bhurt(at)janestcapital(dot)com>, pgsql-novice(at)postgresql(dot)org
Subject: Re: Getting a count from an update
Date: 2006-12-21 05:45:56
Message-ID: 20061221054556.GB24036@wolff.to
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-novice

On Tue, Dec 19, 2006 at 12:54:30 -0600,
Chandra Sekhar Surapaneni <chandu(at)positivenetworks(dot)net> wrote:
> You can use a trigger to update a different table with the count of
> number of rows updated.
> If you use the following sql, then every time you update a table called
> tablename, the count column in the tabletocountrows will be incremented
> for that tablename.

I don't think this is guaranteed to work under concurrent updates unless
you are running in serializable mode and can retry after failed updates.

There are also some things you can do to reduce contention if these updates
are happening very frequently. There should be some suggestions in the
archives from a year or two ago.

>
> create table tabletocountrows (tablename varchar, count int);
>
> insert into tabletocountrows values ('tablename', 0);
>
> create or replace function countUpdatedRows() returns trigger as
> '
> Begin
> update tabletocountrows
> set count = count+1 where tablename = TG_RELNAME;
> Return NULL;
> End;
> ' Language plpgsql;
>
> create trigger countRows after update on tablename for each row execute
> procedure countUpdatedRows();
>
> Regards,
> Chandra Sekhar Surapaneni
>
>
> -----Original Message-----
> From: pgsql-novice-owner(at)postgresql(dot)org
> [mailto:pgsql-novice-owner(at)postgresql(dot)org] On Behalf Of Brian Hurt
> Sent: Thursday, December 14, 2006 1:57 PM
> To: pgsql-novice(at)postgresql(dot)org
> Subject: [NOVICE] Getting a count from an update
>
> Newbie question here: I want to be able to capture the count of the
> number of rows updated from an update command within SQL. I know that
> psql prints out the result, I want to grab it within a function. The
> update is a simple "UPDATE tablename SET col = value WHERE othercol =
> otherval;", which will generally update many dozens or hundreds of
> rows. Currently I'm doing a select before doing the update, but since
> I'm doing a select count(*) I can't add a 'for update' to the end and
> lock the rows. Is there a better way to do this?
>
> Brian
>
>
> ---------------------------(end of broadcast)---------------------------
> TIP 5: don't forget to increase your free space map settings
>
> ---------------------------(end of broadcast)---------------------------
> TIP 1: if posting/reading through Usenet, please send an appropriate
> subscribe-nomail command to majordomo(at)postgresql(dot)org so that your
> message can get through to the mailing list cleanly

In response to

Browse pgsql-novice by date

  From Date Subject
Next Message Tom Lane 2006-12-21 06:18:18 Re: print statements?
Previous Message Tom Lane 2006-12-20 00:34:30 Re: CREATE ROLE