Received: from magus.postgresql.org (magus.postgresql.org [87.238.57.229]) by mail.postgresql.org (Postfix) with ESMTP id AAED817A3624 for ; Wed, 11 Jul 2012 05:25:15 -0300 (ADT) Received: from mailout02.ims-firmen.de ([213.174.32.97]) by magus.postgresql.org with esmtp (Exim 4.72) (envelope-from ) id 1SosET-0007v9-3z for pgsql-sql@postgresql.org; Wed, 11 Jul 2012 08:25:14 +0000 Received: from mailin01.ims-firmen.de ([192.168.1.141]) by mailout02.ims-firmen.de with esmtp (envelope-from ) id 1SosEG-0008Mt-kA for pgsql-sql@postgresql.org; Wed, 11 Jul 2012 10:25:00 +0200 Received: from [87.170.179.119] (helo=a-kretschmer.de) by mailin01.ims-firmen.de with esmtpsa (TLSv1:AES256-SHA:256) (envelope-from ) id 1SosEG-0006Wg-0B for pgsql-sql@postgresql.org; Wed, 11 Jul 2012 10:25:00 +0200 Received: from kretschmer by a-kretschmer.de with local (Exim 4.69) (envelope-from ) id 1SosEE-00050C-NH for pgsql-sql@postgresql.org; Wed, 11 Jul 2012 10:24:58 +0200 Date: Wed, 11 Jul 2012 10:24:58 +0200 From: Andreas Kretschmer To: pgsql-sql@postgresql.org Subject: Re: Prevent double entries ... no simple unique index Message-ID: <20120711082458.GA19013@tux> References: <4FFD3050.3010509@gmx.net> <20120711081607.GA17798@tux> MIME-Version: 1.0 Content-Type: text/plain; charset=iso-8859-1 Content-Disposition: inline Content-Transfer-Encoding: 8bit In-Reply-To: <20120711081607.GA17798@tux> X-OS: Debian/GNU Linux - weil ich es mir Wert bin! X-GPG-Fingerprint: EE16 3C01 7B9C 10F7 2C8B 3B86 4DB3 D9EE 7F45 84DA X-Message-Flag: "Windows" is not the answer. "Windows" is the question and the answer is "no"! X-Lugdd: Gerd Kube X-Info: My name is root. Just root. And I am licensed to kill -9 User-Agent: Mutt/1.5.18 (2008-05-17) X-Pg-Spam-Score: -1.9 (-) X-Archive-Number: 201207/7 X-Sequence-Number: 36744 Andreas Kretschmer wrote: > Andreas wrote: > > > Hi, > > > > I've got a log-table that records events regarding other objects. > > Those events have a state that shows the progress of further work on > > this event. > > They can be open, accepted or rejected. > > > > I don't want to be able to insert addition events regarding an object X > > as long there is an open or accepted event. > > On the other hand as soon as the current event gets rejected a new event > > should be possible. > > > > So there may be several rejected events at any time but no more than 1 > > open or accepted entry. > > > > Can I do this within the DB so I don't have to trust the client app? > > > > The layout looks like this > > Table : objects ( id serial, .... ) > > > > Table : event_log ( id serial, oject_id integer references objects.id, > > state integer, date_created timestamp, ... ) > > where state is 0 = open, -1 = reject, 1 = accept > > test=# create table log (state int not null, check (state in (-1,0,1))); > CREATE TABLE > Time: 37,527 ms > test=*# commit; > COMMIT > Time: 0,556 ms > test=# create unique index on log((case when state in (0,1) then 1 else > null end)); > CREATE INDEX Or this one: test=*# create unique index on log((case when state = 0 then 0 when state = 1 then 1 else null end)); CREATE INDEX Now you can insert one '0' and one '1' - value - but no more. Andreas -- Really, I'm not out to destroy Microsoft. That will just be a completely unintentional side effect. (Linus Torvalds) "If I was god, I would recompile penguin with --enable-fly." (unknown) Kaufbach, Saxony, Germany, Europe. N 51.05082°, E 13.56889°