Re: safely exchanging primary keys? - Mailing list pgsql-sql

From Tim Landscheidt
Subject Re: safely exchanging primary keys?
Date
Msg-id m3d3wl1i1c.fsf@passepartout.tim-landscheidt.de
Whole thread Raw
In response to safely exchanging primary keys?  (Louis-David Mitterrand <vindex+lists-pgsql-sql@apartia.org>)
Responses Re: safely exchanging primary keys?  (Louis-David Mitterrand <vindex+lists-pgsql-sql@apartia.org>)
List pgsql-sql
Louis-David Mitterrand <vindex+lists-pgsql-sql@apartia.org> wrote:

> I have this function which swaps primary keys for cabin_types (so that
> id_cabin_type ordering reflects natural data ordering):

>     CREATE OR REPLACE FUNCTION swap_cabin_types(id1 integer, id2 integer) RETURNS integer
>         AS $$
>     declare
>         tmp integer;
>     begin
>         tmp := nextval('cabin_type_id_cabin_type_seq');
>         update cabin_type set id_cabin_type=tmp where id_cabin_type=id1;
>         update cabin_type set id_cabin_type=id1 where id_cabin_type=id2;
>         update cabin_type set id_cabin_type=id2 where id_cabin_type=tmp;
>         return tmp;
>     end;
>     $$
>     LANGUAGE plpgsql;

> 'id_cabin_type' is a foreign key for two other tables, 'cabin_category'
> and 'alert_cabin_type', which have an "on update cascade" clause.

> When I run that function it seems the foreign keys are not properly
> updated and the data ends up in a mess.

> Did I forget something?

What does "are not properly updated" mean? Anyhow, why don't
you use something simple like (untested):

| UPDATE cabin_type
|   SET id_cabin_type =
|     CASE
|       WHEN id_cabin_type = id1 THEN
|         id2
|       ELSE
|         id1
|     END
|   WHERE id_cabin_type IN (id1, id2);

Tim



pgsql-sql by date:

Previous
From: Tom Lane
Date:
Subject: Re: safely exchanging primary keys?
Next
From: Louis-David Mitterrand
Date:
Subject: Re: safely exchanging primary keys?