Re: renumber table

From: "David Spadea" <david(dot)spadea(at)gmail(dot)com>
To: "Steve Clark" <sclark(at)netwolves(dot)com>
Cc: "Scott Marlowe" <scott(dot)marlowe(at)gmail(dot)com>, pgsql <pgsql-general(at)postgresql(dot)org>
Subject: Re: renumber table
Date: 2008-06-19 23:07:10
Message-ID: 4ae0cb070806191607k485d7d2ane243f803a6764dc3@mail.gmail.com
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-general

Steve,

Here's your problem and its solution as I understand it:

-- Given an example table like this (data isn't too important -- just the
sequencing)
create table meh
(
id serial primary key
, word varchar(10)
);

-- Populate it with data

insert into meh (word) values
('one'),
('two'),
('three'),
('four'),
('five'),
('six'),
('seven'),
('eight'),
('nine'),
('ten');

-- Delete a row from the middle of the table
delete from meh where id = 5;

-- Renumber all of the rows ABOVE the deleted row
-- This will maintain sequencing. This assumes that no gaps existed prior to
the delete of this row,
-- and that only one row was deleted.

update meh
set id = id - 1
where id > 5;

At this point, if you've got a sequence that populates the id field, you'll
need to set its nextval.

Dave

On Thu, Jun 19, 2008 at 7:54 AM, Steve Clark <sclark(at)netwolves(dot)com> wrote:

> Scott Marlowe wrote:
>
>> On Wed, Jun 18, 2008 at 3:50 PM, Steve Clark <sclark(at)netwolves(dot)com>
>> wrote:
>>
>> I realize this is certainly not the best design - but at this point in
>>> time
>>> it can't be changed. The table
>>> is rarely updated and never concurrently and is very small, typically
>>> less
>>> than 100 rows so there really is
>>> no performance impact.
>>>
>>
>>
>> Then the easiest way to renumber a table like that is to do something
>> like:
>>
>> create temp sequence myseq;
>> update table set idfield=nextval('myseq');
>>
>> and hit enter.
>> and pray. :)
>>
>>
>> Hi Scott,
>
> I am not sure that will do what I want. As an example
> suppose I have 5 rows and the idfield is 1,2,3,4,5
> now row 1 is updated, not the idfield but another column, then row 3 is
> deleted.
> Now I would like to renumber them such that 1 is 1, 2 is 2, 4 is 4 , 5 is
> 4.
>
> I don't think what you wrote will necessarily keep them in the same
> relative order that they
> were before.
>
> Regards,
> Steve
>
>
> --
> Sent via pgsql-general mailing list (pgsql-general(at)postgresql(dot)org)
> To make changes to your subscription:
> http://www.postgresql.org/mailpref/pgsql-general
>

In response to

Responses

Browse pgsql-general by date

  From Date Subject
Next Message Douglas McNaught 2008-06-19 23:07:18 Re: Importing undelimited files (Flat Files or Fixed-Length records)
Previous Message Bill Thoen 2008-06-19 22:54:34 Importing undelimited files (Flat Files or Fixed-Length records)