sequence not restarting in a for loop (actually semi-random numbers)

Started by Ivan Sergio Borgonovoover 17 years ago3 messagesgeneral
Jump to latest
#1Ivan Sergio Borgonovo
mail@webthatworks.it

I've a function that does something like:

create temp sequence tmp_seq;
for _row in (select id from mylist where Weight<_Weight)
loop
alter sequence tmp_seq restart with 1;
-- perform setval('tmp_seq',1,false);
insert into mytop (id,n) select id, nextval('tmp_seq')
from biglist join mylist on biglist.id=mylist
order by biglist.something limit 3;
end loop;
drop sequence tmp_seq;

I'd expect something like

1,1
1,2
1,3
127,1
127,2
127,3

but I get something like

1,5
1,6
1,7
127,55
127,56
127,57
152,6
152,7
152,8

what should I do to obtain the result I was expecting?

--
Ivan Sergio Borgonovo
http://www.webthatworks.it

#2Tom Lane
tgl@sss.pgh.pa.us
In reply to: Ivan Sergio Borgonovo (#1)
Re: sequence not restarting in a for loop (actually semi-random numbers)

Ivan Sergio Borgonovo <mail@webthatworks.it> writes:

insert into mytop (id,n) select id, nextval('tmp_seq')
from biglist join mylist on biglist.id=mylist
order by biglist.something limit 3;

I suspect you are expecting the nextval()s to be done after the LIMIT,
but actually they'll most likely be done before it, ie you're getting
a lot of unintended nextvals happening. Try doing the ORDER BY/LIMIT
in a sub-select.

regards, tom lane

#3Ivan Sergio Borgonovo
mail@webthatworks.it
In reply to: Tom Lane (#2)
Re: sequence not restarting in a for loop (actually semi-random numbers)

On Wed, 12 Nov 2008 11:17:03 -0500
Tom Lane <tgl@sss.pgh.pa.us> wrote:

Ivan Sergio Borgonovo <mail@webthatworks.it> writes:

insert into mytop (id,n) select id, nextval('tmp_seq')
from biglist join mylist on biglist.id=mylist
order by biglist.something limit 3;

I suspect you are expecting the nextval()s to be done after the
LIMIT, but actually they'll most likely be done before it, ie
you're getting a lot of unintended nextvals happening. Try doing
the ORDER BY/LIMIT in a sub-select.

Thanks. That did it.

I think I've seen similar replies before... but I couldn't relate
them to my problem.

I'd do like Bart Simpson: order by, limit, nextval, sequence, order
by, limit, nextval, sequence...
so that this answer will be well indexed ;)

--
Ivan Sergio Borgonovo
http://www.webthatworks.it