Re: How to append records into a file which has serial

From: george young <gry(at)ll(dot)mit(dot)edu>
To: pgsql-novice(at)postgresql(dot)org
Subject: Re: How to append records into a file which has serial
Date: 2006-04-09 02:21:14
Message-ID: 20060408222114.7c7a99b5.gry@ll.mit.edu
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-novice

On Sat, 8 Apr 2006 08:09:32 -0700
James Long <pgsql-novice(at)museum(dot)rain(dot)com> threw this fish to the penguins:

> Please pardon any duplication, but the previous two posts do not
> appear to have made it to the list.
>
> ----- Forwarded message -----
>
> Subject: How to append records into a file which has serial unique IDs?
> To: pgsql-novice(at)postgresql(dot)org
> Date: Wed, 5 Apr 2006 00:37:48 -0700 (PDT)
> X-Mailer: ELM [version 2.5 PL8]
>
> Suppose I have a table "foo" with columns a b and c. A is a serial unique key.
>
> What's a good way to copy a record to a temp table, and then append it
> back in as a new record, automatically assigning a new serial key?
>
> It appears that:
>
> create temp table bar as select (*) from foo;
> insert into foo (*) select (*) from bar;
>
> isn't the way to do it.

This worked for me:

newschm3=> create table foo(x text,y text,a serial);
newschm3=> insert into foo (x,y) values ('the','red');
INSERT 0 1
newschm3=> insert into foo (x,y) values ('rain','green');
INSERT 0 1
newschm3=> insert into foo (x,y) values ('in','blue');
INSERT 0 1
newschm3=> create temp table bar as select * from foo where y='red';
SELECT
newschm3=> alter table bar drop column a;
newschm3=> insert into foo select * from bar;
INSERT 0 1

newschm3=> select * from foo;
x | y | a
------+-------+----
the | red | 1
rain | green | 2
in | blue | 3
the | red | 4

You don't need to know the field names "x" and "y", just the
serial field name "a".

Is this what you meant?

[BTW, it's always good practice to include the exact version of postgres
and your platform in questions, to save extra round-trips like "Are you
using version 8.1.2.3 of postgres? It has a bug that makes your
fingernails turn green...".]

-- George Young

> If I explicitly name fields in the CREATE, INSERT and SELECT
> clauses (so as to exclude field a), then I have to know and
> maintain a list of each and every field and this becomes a
> maintenance headache any time the column names change in foo.
>
> I could live with a solution that required me to know just
> the name of the one field I want to exclude, such as
>
> create temp table temp as select (* except a) from foo;
> insert into foo (* except a) select (* except a) from bar;
>
> I have done a fair amount of old-school DOS database stuff, but
> am rather new to SQL, so if this is a simple question, then that's
> why I'm asking on the novice list! :)
>
> But surely, there must be a nice general solution to this, since
> it would seem to happen in a *large* number of master/transaction
> situations, where a ledger of transactions is posted, and then the
> posted transactions are archived into a history file, before clearing
> the batch to make way for the next batch. Suppose both the batch
> file and the history file use unique serial IDs, and each table's
> IDs are numbered separately -- one has to be able to append all fields
> except the serial from a number of rows, while simultaneously
> generating new serials for each of the rows appended....
>
> Once I figure out how, I would create a php subroutine with
> parameterized table names and field name(s) to exclude on insert, and
> then be able to easily append serialized records with no other
> knowledge of the underlying structure of the specific table being
> operated upon.
>
> I just can't find a clean way to do it. Suggestions are appreciated.
>
>
> Thanks, and regards from Portland,
>
> Jim Long
>
>
> ----- End forwarded message -----
>
> ---------------------------(end of broadcast)---------------------------
> TIP 4: Have you searched our list archives?
>
> http://archives.postgresql.org
>

--
"Are the gods not just?" "Oh no, child.
What would become of us if they were?" (CSL)

In response to

Responses

Browse pgsql-novice by date

  From Date Subject
Next Message Michael Glaesemann 2006-04-09 02:30:10 Re: How to append records into a file which has serial
Previous Message Tom Lane 2006-04-08 16:19:11 Re: out or memory error