pg.ddx.io  pgsql-sql@postgresql.org mailing list archive  
help / color / mirror / Atom feed
From: Rod Taylor <rbt@rbt.ca>
To: daniel alvarez <d-alvarez@gmx.de>
Cc: pgsql-sql@postgresql.org
Subject: Re: Atomicity of UPDATE, interchanging values in unique column
Date: 08 Mar 2003 16:33:22 -0500
Message-ID: <1047159202.28251.196.camel@jester> (raw)
In-Reply-To: <32207.1047158233@www5.gmx.net>
References: <32207.1047158233@www5.gmx.net>


> UPDATE sometable SET unique_col =
>    CASE WHEN unique_col = firstvalue THEN secondvalue
>             ELSE  firstvalue
>    END
> WHERE unique_col = firstvalue
>       OR unique_col = secondvalue

(See last comment)

> BEGIN;
> SET TRANSACTION ISOLATION LEVEL SERIALIZABLE;
> 
> UPDATE sometable SET unique_col = firstvalue WHERE unique_col = secondvalue;
> UPDATE sometable SET unique_col = secondvalue WHERE unique_col = firstvalue;
> 
> COMMIT;

This one will always fail unless you DEFER unique constraints --
something we don't support with PostgreSQL, but some others do.

> How can I interchange two values in a unique column? Am I missing something
> really
> obvious (like a swap statement)? Is there any reason besides performance for
> not
> making index accesses fully ACID-compliant? Doesn't MVCC require this
> anyway?

The first is what you want.  PostgreSQL needs some work in the
evaluation of unique indexes to properly support it.

Namely, when it sees a conflict when inserting into the index, it needs
to record the fact, and revisit the conflict at the end of the command. 
Lots of work...

-- 
Rod Taylor <rbt@rbt.ca>

PGP Key: http://www.rbt.ca/rbtpub.asc

Attachments:

  signature.asc (application/pgp-signature, 186B) download

view thread (6+ messages)  latest in thread

Message-ID: <1047159202.28251.196.camel@jester>
Permalink:  ../1047159202.28251.196.camel@jester/
Also on:    postgresql.org/message-id/1047159202.28251.196.camel@jester

 · 

reply

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Reply to all the recipients using the --to and --cc options:
  reply via email

  To: pgsql-sql@postgresql.org
  Cc: rbt@rbt.ca, d-alvarez@gmx.de
  Subject: Re: Atomicity of UPDATE, interchanging values in unique column
  In-Reply-To: <1047159202.28251.196.camel@jester>

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

This inbox is served by DDX for PostgreSQL; see mirroring instructions
for how to clone and mirror all data and code used for this inbox