From: | Misa Simic <misa(dot)simic(at)gmail(dot)com> |
---|---|
To: | Michael Sacket <msacket(at)gammastream(dot)com> |
Cc: | PG-General Mailing List <pgsql-general(at)postgresql(dot)org> |
Subject: | Re: [GENERAL] INSERT… RETURNING for copying records |
Date: | 2012-09-08 19:20:11 |
Message-ID: | CAH3i69nG8bLMz+Av5xbhMkikv=1Y2VJ+GemVyGggbTTqUR9Bkw@mail.gmail.com |
Views: | Raw Message | Whole Thread | Download mbox | Resend email |
Thread: | |
Lists: | pgsql-general |
You can make function what returns integer and has input parametars as
other columns of the table:
INSERT INTO testing (category, name, fk_parent) (input parameters)
returning rid
Then SELECT rid as OriginalId, make_copy(other columns) as new_rid From
testing
Kind Regards,
Misa
On Friday, September 7, 2012, Michael Sacket wrote:
> Good Afternoon,
>
> I'm attempting to write a function that will duplicate a few records, but
> the catch is I need to have a mapping of the original pk to the new pk. I
> know I can use the RETURNING clause to get the new ids... but how to map
> that to the original ones is escaping me.
>
> < Setup >
>
> CREATE TABLE testing (rid serial PRIMARY KEY, category text NOT NULL, name
> text NOT NULL, fk_parent int4);
>
> INSERT INTO testing (category, name, fk_parent) VALUES ('cat1', 'one',
> NULL), ('cat1', 'one.one', 1), ('cat1', 'one.two', 1);
>
> SELECT * FROM testing;
> +-----+----------+---------+-----------+
> | rid | category | name | fk_parent |
> +-----+----------+---------+-----------+
> | 1 | cat1 | one | NULL |
> | 2 | cat1 | one.one | 1 |
> | 3 | cat1 | one.two | 1 |
> +-----+----------+---------+-----------+
>
> < Duplicating the records >
>
> INSERT INTO testing (category, name, fk_parent) (select category, name,
> fk_parent from testing where category='cat1') returning rid, category,
> name, fk_parent;
> +-----+----------+---------+-----------+
> | rid | category | name | fk_parent |
> +-----+----------+---------+-----------+
> | 4 | cat1 | one | NULL |
> | 5 | cat1 | one.one | 1 |
> | 6 | cat1 | one.two | 1 |
> +-----+----------+---------+-----------+
>
> < What I'm looking for >
> +--------------+-----+
> | original_rid | rid |
> +--------------+-----+
> | 1 | 4 |
> | 2 | 5 |
> | 3 | 6 |
> +--------------+-----+
>
> < This doesn't work >
>
> INSERT INTO testing (category, name, fk_parent) select category, name,
> fk_parent from testing as original where category='cat1' returning rid,
> category, name, fk_parent, original.rid;
>
>
> Specifically, my goal is to be able to duplicate a subset of records and
> map any referenced foreign keys to the new ones from the copies. I could
> write a pl/pgsql function to loop through the records and build the mapping
> as I go, but I was thinking there might be a better way. Any thoughts?
>
> Thanks!
> Michael
>
>
>
>
>
>
>
>
>
From | Date | Subject | |
---|---|---|---|
Next Message | Andreas Kretschmer | 2012-09-08 19:24:14 | Re: Add a check an a array column |
Previous Message | Gražvydas Valeika | 2012-09-08 19:03:53 | Re: Packaging of plpython |