X-Original-To: pgsql-general-postgresql.org@localhost.postgresql.org Received: from localhost (unknown [200.46.204.144]) by svr1.postgresql.org (Postfix) with ESMTP id 0162932A0F7 for ; Wed, 20 Oct 2004 20:29:39 +0100 (BST) Received: from svr1.postgresql.org ([200.46.204.71]) by localhost (av.hub.org [200.46.204.144]) (amavisd-new, port 10024) with ESMTP id 94796-08 for ; Wed, 20 Oct 2004 19:29:27 +0000 (GMT) Received: from service-web.de (p15093784.pureserver.info [217.160.106.224]) by svr1.postgresql.org (Postfix) with ESMTP id A797532A10E for ; Wed, 20 Oct 2004 20:29:27 +0100 (BST) Received: from Gc94f.g.pppool.de (Gc94f.g.pppool.de [80.185.201.79]) by service-web.de (Postfix) with ESMTP id 2B73D200024; Wed, 20 Oct 2004 21:29:26 +0200 (CEST) Subject: Re: Sequence question From: Tino Wildenhain To: Eric E Cc: pgsql-general@postgresql.org In-Reply-To: <4176A5FB.5090708@bonbon.net> References: <3sydnUgMwqQ80-ncRVn-uA@speakeasy.net> <1098286552.21062.333.camel@sabrina.peacock.de> <4176A5FB.5090708@bonbon.net> Content-Type: text/plain Message-Id: <1098300565.4042.31.camel@Andrea.peacock.de> Mime-Version: 1.0 X-Mailer: Ximian Evolution 1.4.6 Date: Wed, 20 Oct 2004 21:29:25 +0200 Content-Transfer-Encoding: 7bit X-Virus-Scanned: by amavisd-new at hub.org X-Spam-Status: No, hits=0.0 tagged_above=0.0 required=5.0 tests= X-Spam-Level: X-Archive-Number: 200410/933 X-Sequence-Number: 67456 Hi, Am Mi, den 20.10.2004 schrieb Eric E um 19:52: > Hi Tino, > Many thanks for helping me. > > I know that the sequence issue is a troubling one for many on the list. > Perhaps if I explain the need for a continuous sequence I can circumvent > some of that: > > This database is for a laboratory, and the numbers in sequence > determine storage locations for a sample. Having a physical space in > our storage boxes tells us something has happened - the sample was used > up, broken, in use, etc - and account for that missing sample. If the > generated sequence has holes in it, we cannot tell if a sample is > properly not in the rack, or if that hole was simply generated by the > database. Allowing empties would also fill up limited box space with > spaces generated by the database. > If anyone has a brilliant idea for how a non-continuous sequence could > address the needs, I'd be delighted to hear it, but short of that I > think I have to keep this requirement. Maybe you skip the sequence thingy alltogether in this case and use an approach like this: initialize a table with all possible locations and mark them as empty. CREATE TABLE locations (location_id int2,taken bool); (you might want to have a timestamp for changes too) Whenever you change state of a location, do it like this (perhaps in a function) SELECT INTO loc_id location_id FROM locations WHERE taken FOR UPDATE; IF FOUND THEN UPDATE location SET taken=true WHERE location_id=loc_id; ELSE RAISE EXCEPTION 'no free location anymore'; ... AND the other way round for freeing a location. The SELECT ... FOR UPDATE should lock the candidate position in the table so concurrent transactions have to wait then then find another free cell when they wake up. Advantage: not a full table scan. Only the first matching row should be used and locked. Not this is only a rough sketch and you should look for the actual syntax and more flesh for the function. Regards Tino