Skip site navigation (1) Skip section navigation (2)

Re: Copying data from table to table (cloned tables)

From: "Jim C(dot) Nasby" <jim(at)nasby(dot)net>
To: Bricklen Anderson <banderson(at)presinet(dot)com>
Cc: Fourat Zouari <fourat(at)gmail(dot)com>, pgsql-novice(at)postgresql(dot)org,pgsql-admin(at)postgresql(dot)org
Subject: Re: Copying data from table to table (cloned tables)
Date: 2006-10-10 15:24:57
Message-ID: 20061010152457.GG72517@nasby.net (view raw or flat)
Thread:
Lists: pgsql-adminpgsql-novice
On Mon, Oct 09, 2006 at 05:02:07PM -0700, Bricklen Anderson wrote:
> Fourat Zouari wrote:
> >Hello all,
> >Any one could suggest the best way to copy data from table to table in 
> >the same db, the reason why am seeking for this is that the first table 
> >is becoming very big, and old data has no reason why to stay there, so i 
> >created a cloned table but without indexes and constraints (lighter) and 
> >now i would like to copy 'some' data from first to second table (copied 
> >data is data older than 3 months, i have a timestamp column).
> >
> >In other way, i have a table called 'hotqueues' where i store fresh 
> >messages queued, once messages are treated, they stay in 'hotqueues' but 
> >with a flag indicating that their arent queued for treatment..
> >so in this way, data will rest there forever, slowing down any searches 
> >in that table, the solution was to copy old messages to another table 
> >called 'coldqueues' that has the same structure as 'hotqueues' but 
> >lighter (without constraints and indexes).
> >How to copy these data with 100% data-loose free.
> >
> >Thanks for any help you can provide.
> 
> If you just want to copy the data across to the other table:
> begin;
> insert into table2 select * from table1 where <some criteria>;
> commit;
> 
> if you also want to remove that same data from table1:
> begin;
> insert into table2 select * from table1 where <some criteria>;
> delete from table1 where <same criteria as above>;
> commit;

You need to be careful with this method. For what the OP wants to do it
would probably work, but not always. The problem is that in some
scenarios, <same criteria as above> won't necessarily return the same
set of rows.

Starting in 8.2 you'll be able to do something like

INSERT INTO table2 DELET FROM table1 WHERE ... RETURNING *;

The RETURNING * will return all the data that the command deleted. In
older versions, your best bet is to store the data you're moving in a
temporary table, and then use that to delete the exact rows.
-- 
Jim Nasby                                            jim(at)nasby(dot)net
EnterpriseDB      http://enterprisedb.com      512.569.9461 (cell)

In response to

Responses

pgsql-novice by date

Next:From: Jim C. NasbyDate: 2006-10-10 15:37:25
Subject: Re: Copying data from table to table (cloned tables)
Previous:From: Fourat ZouariDate: 2006-10-10 09:35:04
Subject: Re: [NOVICE] Copying data from table to table (cloned tables)

pgsql-admin by date

Next:From: Jim C. NasbyDate: 2006-10-10 15:37:25
Subject: Re: Copying data from table to table (cloned tables)
Previous:From: Jim C. NasbyDate: 2006-10-10 15:15:42
Subject: Re: Recursive use

Privacy Policy | About PostgreSQL
Copyright © 1996-2014 The PostgreSQL Global Development Group