Re: noobie question

From: Jeff Janes <jeff(dot)janes(at)gmail(dot)com>
To: Chris Angelico <rosuav(at)gmail(dot)com>
Cc: pgsql-general(at)postgresql(dot)org
Subject: Re: noobie question
Date: 2013-01-24 17:36:25
Message-ID: CAMkU=1zAfbTq6Z6d=2kGeCcnf2Qv5MaKZ5VuAfmsebqF5Uiuqg@mail.gmail.com
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-general

On Thu, Jan 24, 2013 at 8:53 AM, Chris Angelico <rosuav(at)gmail(dot)com> wrote:
> On Fri, Jan 25, 2013 at 3:47 AM, Steve Clark <sclark(at)netwolves(dot)com> wrote:
>> Say I have a table that has 2 columns like
>> create table "foo" (
>> id integer not null,
>> name text
>> );
>> CREATE UNIQUE INDEX "foo_pkey" on "foo" using btree ( "id" "int4_ops" );
>>
>> with 10 rows of data where id is 1 to 10.
>>
>> Now I want to insert a new row ahead of id 5 so I have to renumber the rows
>> from 5 to 10 increasing each by one.
>>
>> Or the opposite I want to delete a row an renumber to close up the gap.
>>
>> Is there an easy way to do this in postgresql without resulting to some
>> external language?
>
> This is sounding, not like an ID, but like a "position" marker or
> something. It's most certainly possible; all you need is a searched
> update:
>
> UPDATE foo SET id=id+1 WHERE id>=5;
> INSERT INTO foo VALUES (5,'new item at pos 5');

To do this reliably, you would have to set the unique constraint to
DEFERRABLE INITIALLY DEFERRED, otherwise you will get errors due to
transient duplicates.

If his design requires that this kind of update be done regularly, he
should probably reconsider that design.

Cheers,

Jeff

In response to

Responses

Browse pgsql-general by date

  From Date Subject
Next Message Adrian Klaver 2013-01-24 17:39:13 Re: main.log file not being updated
Previous Message Pavel Stehule 2013-01-24 17:32:12 Re: proposal: fix corner use case of variadic fuctions usage