From: | Joshua Moore-Oliva <josh(at)chatgris(dot)com> |
---|---|
To: | Tom Lane <tgl(at)sss(dot)pgh(dot)pa(dot)us> |
Cc: | pgsql-general(at)postgresql(dot)org |
Subject: | Re: Problems requiring a GROUP BY clause on update? |
Date: | 2003-09-17 23:42:47 |
Message-ID: | 200309171942.47966.josh@chatgris.com |
Views: | Raw Message | Whole Thread | Download mbox | Resend email |
Thread: | |
Lists: | pgsql-general |
I am attempting to find out how many rows a query operation affected, then
update a separate row to keep count, because running a SELECT COUNT(id) FROM
lists is far too slow when there are millions of records and the number if
required for a user interface.
So far my only success has only come from making functions for each operation,
and using GET DIAGNOSTICS num_affected := ROW_COUNT;
I don't want triggers to update one at a time because I at times insert
millions of rows, and don't think that millions of update statements is too
healthy :).
Thanks, Josh.
On September 17, 2003 11:23 am, Tom Lane wrote:
> Joshua Moore-Oliva <josh(at)chatgris(dot)com> writes:
> > Attribute lists.list_size_active must be GROUPed or used in an aggregate
> > function
> >
> > CREATE OR REPLACE RULE items_log_insert AS ON INSERT
> > TO listdb.list_items
> > WHERE NEW.active = 1 DO (
> > UPDATE lists SET
> > list_size_active = list_size_active + COUNT( NEW.active )
> > WHERE list_id = NEW.list_id;
> > );
>
> The error message isn't really helpful, perhaps, but I think the system
> is quite right to squawk. What do you expect that command to do? The
> COUNT() is completely meaningless because there isn't anything for it
> to iterate over. (The SQL spec forbids aggregate functions in UPDATE
> lists altogether, and I rather think they are right, though we've not
> yet got around to installing that specific error check.)
>
> Possibly what you want is some kind of sub-select:
>
> UPDATE lists SET
> list_size_active = list_size_active +
> (SELECT COUNT(*) FROM ... WHERE ...)
> WHERE list_id = NEW.list_id;
>
> but I can't help you with what to put for "..." because you've not made
> it clear what you are trying to achieve.
>
> It's also entirely likely that you'd find an ON INSERT trigger to be
> easier to work with than a rule. People frequently try to force rules
> to behave like per-tuple actions, but they almost always lose the
> battle. A rule is a query-level transformation, and it requires a
> different mindset to use effectively.
>
> regards, tom lane
From | Date | Subject | |
---|---|---|---|
Next Message | Robert Wille | 2003-09-18 00:47:30 | Re: Sort order is different on Windows and Linux |
Previous Message | Stephan Szabo | 2003-09-17 23:27:36 | Re: Sort order is different on Windows and Linux |