Обсуждение: Re: [SQL] keeping OID's when copying table

Поиск
Список
Период
Сортировка

Re: [SQL] keeping OID's when copying table

От
Michael Olivier
Дата:
---Bruce Momjian <maillist@candle.pha.pa.us> wrote:
>
> Thank you for pointing out my error.  It should be:
>
>         CREATE TABLE new_table (mycol int);
>         INSERT INTO new_table (oid, mycol) SELECT oid, mycol FROM
old_table;
>
> I have updated the FAQ.

Hmm... now I don't get an error, but the oid isn't preserved. This is
running 6.3.2 on RH Linux:

dmdemo=> CREATE TABLE new_table (mycol int);
CREATE
dmdemo=> CREATE TABLE old_table (mycol int);
CREATE
dmdemo=> insert into old_table values (33);
INSERT 837643 1
dmdemo=> select oid from old_table;
   oid
------
837643
(1 row)

dmdemo=> INSERT INTO new_table (oid, mycol) SELECT oid, mycol FROM
dmdemo-> old_table;
INSERT 837644 1
dmdemo=> select oid from new_table;
   oid
------
837644
(1 row)

Further suggestions?

_________________________________________________________
DO YOU YAHOO!?
Get your free @yahoo.com address at http://mail.yahoo.com


Re: [SQL] keeping OID's when copying tableu

От
Bruce Momjian
Дата:
> ---Bruce Momjian <maillist@candle.pha.pa.us> wrote:
> >
> > Thank you for pointing out my error.  It should be:
> >
> >         CREATE TABLE new_table (mycol int);
> >         INSERT INTO new_table (oid, mycol) SELECT oid, mycol FROM
> old_table;
> >
> > I have updated the FAQ.
>
> Hmm... now I don't get an error, but the oid isn't preserved. This is
> running 6.3.2 on RH Linux:
>
> dmdemo=> CREATE TABLE new_table (mycol int);
> CREATE
> dmdemo=> CREATE TABLE old_table (mycol int);
> CREATE
> dmdemo=> insert into old_table values (33);
> INSERT 837643 1
> dmdemo=> select oid from old_table;
>    oid
> ------
> 837643
> (1 row)
>
> dmdemo=> INSERT INTO new_table (oid, mycol) SELECT oid, mycol FROM
> dmdemo-> old_table;
> INSERT 837644 1
> dmdemo=> select oid from new_table;
>    oid
> ------
> 837644
> (1 row)
>
> Further suggestions?

I can confirm that here.  Seems there is some change that was made that
is now causing this to fail.  I will try to fix it before 6.5.  The only
workaround I can suggest is COPY WITH OID's out and in, but it doesn't
allow you to easily remove columns.

Can someone suggest when it stopped working?

--
  Bruce Momjian                        |  http://www.op.net/~candle
  maillist@candle.pha.pa.us            |  (610) 853-3000
  +  If your life is a hard drive,     |  830 Blythe Avenue
  +  Christ can be your backup.        |  Drexel Hill, Pennsylvania 19026

Re: [SQL] keeping OID's when copying table

От
Bruce Momjian
Дата:
> ---Bruce Momjian <maillist@candle.pha.pa.us> wrote:
> >
> > Thank you for pointing out my error.  It should be:
> >
> >         CREATE TABLE new_table (mycol int);
> >         INSERT INTO new_table (oid, mycol) SELECT oid, mycol FROM
> old_table;
> >
> > I have updated the FAQ.
>
> Hmm... now I don't get an error, but the oid isn't preserved. This is
> running 6.3.2 on RH Linux:
>
> dmdemo=> CREATE TABLE new_table (mycol int);
> CREATE
> dmdemo=> CREATE TABLE old_table (mycol int);
> CREATE
> dmdemo=> insert into old_table values (33);
> INSERT 837643 1
> dmdemo=> select oid from old_table;
>    oid
> ------
> 837643
> (1 row)
>
> dmdemo=> INSERT INTO new_table (oid, mycol) SELECT oid, mycol FROM
> dmdemo-> old_table;
> INSERT 837644 1
> dmdemo=> select oid from new_table;
>    oid
> ------
> 837644
> (1 row)
>
> Further suggestions?

OK, I have a fix for you.

    CREATE TABLE new(old_oid oid, mycol int);
    SELECT INTO new SELECT old_oid, mycol FROM old;
    COPY new TO '/tmp/x';
    DELETE FROM new;
    COPY new WITH OIDS FROM '/tmp/x';

Does this work for your purposes?  I have updated the FAQ.

Should we allow oid's to be transfered via INSERT?  I think we should.

   INSERT INTO new_table (oid, mycol) SELECT oid, mycol FROM old_table

--
  Bruce Momjian                        |  http://www.op.net/~candle
  maillist@candle.pha.pa.us            |  (610) 853-3000
  +  If your life is a hard drive,     |  830 Blythe Avenue
  +  Christ can be your backup.        |  Drexel Hill, Pennsylvania 19026

Re: [SQL] keeping OID's when copying table

От
Bruce Momjian
Дата:
OK, I think Tom Lane fixed this by generating an error in 6.5 beta.


> ---Bruce Momjian <maillist@candle.pha.pa.us> wrote:
> >
> > Thank you for pointing out my error.  It should be:
> > 
> >         CREATE TABLE new_table (mycol int);
> >         INSERT INTO new_table (oid, mycol) SELECT oid, mycol FROM
> old_table;
> > 
> > I have updated the FAQ.
> 
> Hmm... now I don't get an error, but the oid isn't preserved. This is
> running 6.3.2 on RH Linux:
> 
> dmdemo=> CREATE TABLE new_table (mycol int);
> CREATE
> dmdemo=> CREATE TABLE old_table (mycol int);
> CREATE
> dmdemo=> insert into old_table values (33);
> INSERT 837643 1
> dmdemo=> select oid from old_table;
>    oid
> ------
> 837643
> (1 row)
> 
> dmdemo=> INSERT INTO new_table (oid, mycol) SELECT oid, mycol FROM
> dmdemo-> old_table;
> INSERT 837644 1
> dmdemo=> select oid from new_table;
>    oid
> ------
> 837644
> (1 row)
> 
> Further suggestions?
> 
> _________________________________________________________
> DO YOU YAHOO!?
> Get your free @yahoo.com address at http://mail.yahoo.com
> 
> 


--  Bruce Momjian                        |  http://www.op.net/~candle maillist@candle.pha.pa.us            |  (610)
853-3000+  If your life is a hard drive,     |  830 Blythe Avenue +  Christ can be your backup.        |  Drexel Hill,
Pennsylvania19026
 


Re: [SQL] keeping OID's when copying table

От
Tom Lane
Дата:
Bruce Momjian <maillist@candle.pha.pa.us> writes:
> OK, I think Tom Lane fixed this by generating an error in 6.5 beta.

>> dmdemo=> INSERT INTO new_table (oid, mycol) SELECT oid, mycol FROM
>> dmdemo-> old_table;
>> INSERT 837644 1

Hmm, what version did you do this with?  It would fairly reliably crash
the backend in recent times, so a week or two ago I put in a temporary
check to generate an error instead.  I would like to see INSERT or
UPDATE able to set the OID field; but we're too close to 6.5 release
to think about making that work for 6.5.

Right now the only way to preserve OIDs is to use COPY WITH OIDS.
        regards, tom lane