Thread: copy record?
Hi:
From within a perl/DBI script, I want to be able to make a copy of a record in a table, changing only the value of the primary key. I don't know in advance what all the columns are, just the table name.
I suppose I could pull the column names for the table from the metadata, query the table/record for the values to copy, build an insert statement from all of that and run it. But is there a simpler, more elegant way to do this?
Thanks for any help !
Well, I found a better way, but still open to suggestions.
This is what I have so far...
create temporary table foo as select * from maintable where 1-0; -- Credit 4 this goes to a post in the PG archives
insert into foo (select * from maintable where primcol=123);
update foo, set primcol=456;
insert into maintable (select * from foo);
From: pgsql-general-owner@postgresql.org [mailto:pgsql-general-owner@postgresql.org] On Behalf Of Gauthier, Dave
Sent: Thursday, May 26, 2011 4:24 PM
To: pgsql-general@postgresql.org
Subject: [GENERAL] copy record?
Hi:
From within a perl/DBI script, I want to be able to make a copy of a record in a table, changing only the value of the primary key. I don't know in advance what all the columns are, just the table name.
I suppose I could pull the column names for the table from the metadata, query the table/record for the values to copy, build an insert statement from all of that and run it. But is there a simpler, more elegant way to do this?
Thanks for any help !
Gauthier, Dave wrote: > Well, I found a better way, but still open to suggestions. > > This is what I have so far... > > create temporary table foo as select * from maintable where 1-0; -- Credit 4 this goes to a post in the PG archives > insert into foo (select * from maintable where primcol=123); > update foo, set primcol=456; > insert into maintable (select * from foo); This alleviates the need to trick the back-end using 'where 1-0' and also does the insert, all in one go. select * into temp table foo from maintable where primcol=123; update foo set primcol = 456; insert into maintable select * from foo; You also may need this is if you intend to use the same sequence of calls on within the same session: drop table foo; HTH Bosco.
On 2011-05-26, Bosco Rama <postgres@boscorama.com> wrote: > select * into temp table foo from maintable where primcol=123; > update foo set primcol = 456; > insert into maintable select * from foo; > > You also may need this is if you intend to use the same sequence of > calls on within the same session: > > drop table foo; Yet another way to do the same thing: begin; create temportary table foo on commit drop as select * from maintable where primcol=123; update foo, set primcol=456; insert into maintable select * from foo; commit; -- ⚂⚃ 100% natural
On Thu, May 26, 2011 at 3:23 PM, Gauthier, Dave <dave.gauthier@intel.com> wrote: > Hi: > > > > From within a perl/DBI script, I want to be able to make a copy of a record > in a table, changing only the value of the primary key. I don't know in > advance what all the columns are, just the table name. > > > > I suppose I could pull the column names for the table from the metadata, > query the table/record for the values to copy, build an insert statement > from all of that and run it. But is there a simpler, more elegant way to do > this? there's a very easy way using the composite type method as long as you know which field(s) are the primary key -- especially if it's say the first column and an integer. postgres=# \d foo Table "public.foo" Column | Type | Modifiers --------+---------+----------- a | integer | b | integer | Indexes: "foo_a_b_idx" btree (a, b) postgres=# select foo from foo limit 1; foo ------- (1,1) (1 row) change 1 -> 2 textually, cast the text back to the composite and pass it back in insert into foo select (($$(2,1)$$::foo).*); merlin
Hello, I'd like to have more comments about the following case: > . 500KB per PDF file; 30 files per year > . PSQL8.3 . struts2.2.3 + mybatis for sql operation . tomcat6 Added more info Solution: ==================== (1) Save pdfs to file system, only point file name in psql8.3 (2) Save oids of pdfs into table (3) Save pdf files as bytea column in psql8.3 Pros and cons for (1), (2), (3), which is the most efficient way? Thanks a lot! Emi
Hello, I'd like to have more comments about the following case: . 500KB per PDF file; 30 files per year . PSQL8.3 Solution: ==================== (1) Save pdfs to file system, only point file name in psql8.3 (2) Save oids of pdfs into table (3) Save pdf files as bytea column in psql8.3 Pros and cons for (1), (2), (3), which is the most efficient way? Thanks a lot! Emi On 05/27/2011 12:45 AM, Jasen Betts wrote: > On 2011-05-26, Bosco Rama<postgres@boscorama.com> wrote: > >> select * into temp table foo from maintable where primcol=123; >> update foo set primcol = 456; >> insert into maintable select * from foo; >> >> You also may need this is if you intend to use the same sequence of >> calls on within the same session: >> >> drop table foo; > > Yet another way to do the same thing: > > begin; > > create temportary table foo on commit drop as > select * from maintable where primcol=123; > update foo, set primcol=456; > insert into maintable select * from foo; > > commit; >
Re: [SQL] Re: 500KB PDF files for postgresql8.3, which is the most efficient way?
Solution:
====================
(1) Save pdfs to file system, only point file name in psql8.3
(2) Save oids of pdfs into table
(3) Save pdf files as bytea column in psql8.3
Pros and cons for (1), (2), (3), which is the most efficient way?
Re: [SQL] 500KB PDF files for postgresql8.3, which is the most efficient way?
* Emi Lu <emilu@encs.concordia.ca> wrote: > Solution: > ==================== > (1) Save pdfs to file system, only point file name in psql8.3 > > (2) Save oids of pdfs into table > > (3) Save pdf files as bytea column in psql8.3 (4) Put them into an object store, eg. venti. cu -- ---------------------------------------------------------------------- Enrico Weigelt, metux IT service -- http://www.metux.de/ phone: +49 36207 519931 email: weigelt@metux.de mobile: +49 151 27565287 icq: 210169427 skype: nekrad666 ---------------------------------------------------------------------- Embedded-Linux / Portierung / Opensource-QM / Verteilte Systeme ----------------------------------------------------------------------