X-Original-To: pgsql-sql-postgresql.org@localhost.postgresql.org Received: from localhost (av.hub.org [200.46.204.144]) by postgresql.org (Postfix) with ESMTP id EE2289DC817 for ; Thu, 29 Dec 2005 03:10:35 -0400 (AST) Received: from postgresql.org ([200.46.204.71]) by localhost (av.hub.org [200.46.204.144]) (amavisd-new, port 10024) with ESMTP id 59283-08 for ; Thu, 29 Dec 2005 03:10:35 -0400 (AST) X-Greylist: from auto-whitelisted by SQLgrey- Received: from wolff.to (wolff.to [66.93.197.194]) by postgresql.org (Postfix) with SMTP id 9E9C99DC804 for ; Thu, 29 Dec 2005 03:10:32 -0400 (AST) Received: (qmail 6242 invoked by uid 500); 29 Dec 2005 07:16:25 -0000 Date: Thu, 29 Dec 2005 01:16:25 -0600 From: Bruno Wolff III To: David Garamond Cc: pgsql-sql@postgresql.org Subject: Re: constraint and ordered value Message-ID: <20051229071625.GA2815@wolff.to> Mail-Followup-To: Bruno Wolff III , David Garamond , pgsql-sql@postgresql.org References: <43B17F52.7000305@zara.6.isreserved.com> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <43B17F52.7000305@zara.6.isreserved.com> User-Agent: Mutt/1.4.2.1i X-Virus-Scanned: by amavisd-new at hub.org X-Spam-Status: No, score=0.032 required=5 tests=[AWL=0.032] X-Spam-Score: 0.032 X-Spam-Level: X-Archive-Number: 200512/238 X-Sequence-Number: 23780 On Wed, Dec 28, 2005 at 00:52:18 +0700, David Garamond wrote: > Is it possible to use only CHECK constraint (and not triggers) to > completely enforce ordered value of a column (colx) in a table? By that > I mean: > > 1. Rows must be inserted in the order of colx=1, then colx=2, 3, and so on; > > 2. When deleting (or updating), "holes" must not be formed, e.g. if > there are three rows then row with colx=3 must be the first one deleted, > and then colx=2 the second, and so on. > > I can see #1 being accomplished using a NOT NULL + UNIQUE constraint and > a CHECK constraint that calls some PL function where the function does a > simple checking (new.colx=1 if COUNT(colx)==0, or new.colx=MAX(colx)+1). > > But is it possible to do #2 using only constraints? No. A constraint only applies to one row at a time. If you try to work around this by calling a function that does queries it isn't guarenteed to work. And if you are thinking of calling a function that does a query, you aren't looking at saving time over using triggers. Also, if you are going to have concurrent updates, you are going to need to do table locking to make this work.