Change order of table-columns in pg_catalog.pg_attribute.attnum

Lists: pgsql-admin
From: Erwin Brandstetter <brsaweda(at)gmail(dot)com>
To: pgsql-admin(at)postgresql(dot)org
Subject: Change order of table-columns in pg_catalog.pg_attribute.attnum
Date: 2007-06-06 13:59:48
Message-ID: 1181138388.508384.51110@q75g2000hsh.googlegroups.com
Views: Raw Message | Whole Thread | Download mbox | Resend email
Lists: pgsql-admin

Hi group!

If I want to change the default order of two columns of a table, can I
just manipulate the values in
pg_catalog.pg_attribute.attnum?
I am trying to do this in pg 8.1.9. Works the same in pg 8.2.x I would
assume?

BEGIN;
UPDATE pg_catalog.pg_attribute SET attnum = 4
WHERE attrelid = 12345
AND attname = 'col3'
AND attnum = 2;

UPDATE pg_catalog.pg_attribute SET attnum = 2
WHERE attrelid = 12345
AND attname = 'col2'
AND attnum = 3;

UPDATE pg_catalog.pg_attribute SET attnum = 3
WHERE attrelid = 12345
AND attname = 'col3'
AND attnum = 4;
COMMIT;

-- That's how I got the necessary data (attrelid, attnum):
SELECT a.attrelid, a.attname, a.attnum
FROM pg_class c, pg_namespace nc, pg_attribute a
WHERE c.relnamespace = nc.oid
AND a.attrelid = c.oid
AND nc.nspname = 'myschema'
AND c.relname = 'mytbl'
AND a.attnum >= 1;

- I assume I have to avoid holes in the numbering of the visible
attributes of the relation.
- To avoid temporary duplicates in attnum I first move one of the
columns to a new postition, so I need 3 operations to switch the
position of two fields.
- All in one transaction, so it should should be immune to other
people trying to access the table.

Anything else I need to bear in mind? Does it work like this at all?
Are there side effects?
I did not find any contradicting info here:
http://www.postgresql.org/docs/8.1/interactive/catalog-pg-attribute.html
I have tried it on a dummy table and it _seems_ to work ..

I know it is dangerous to mess with data in pg_catalog. But recreating
a table is such a pain when several foreign key constraints point to
it.

So maybe one of more knowing could comment on it?

Thanks in advance!
Regards
Erwin


From: Alvaro Herrera <alvherre(at)commandprompt(dot)com>
To: Erwin Brandstetter <brsaweda(at)gmail(dot)com>
Cc: pgsql-admin(at)postgresql(dot)org
Subject: Re: Change order of table-columns in pg_catalog.pg_attribute.attnum
Date: 2007-06-06 14:38:52
Message-ID: 20070606143852.GF6377@alvh.no-ip.org
Views: Raw Message | Whole Thread | Download mbox | Resend email
Lists: pgsql-admin

Erwin Brandstetter escribió:
> Hi group!
>
> If I want to change the default order of two columns of a table, can I
> just manipulate the values in
> pg_catalog.pg_attribute.attnum?

It works -- as long as the table is empty.

--
Alvaro Herrera http://www.CommandPrompt.com/
PostgreSQL Replication, Consulting, Custom Development, 24x7 support


From: Tom Lane <tgl(at)sss(dot)pgh(dot)pa(dot)us>
To: Alvaro Herrera <alvherre(at)commandprompt(dot)com>
Cc: Erwin Brandstetter <brsaweda(at)gmail(dot)com>, pgsql-admin(at)postgresql(dot)org
Subject: Re: Change order of table-columns in pg_catalog.pg_attribute.attnum
Date: 2007-06-06 14:59:19
Message-ID: 21001.1181141959@sss.pgh.pa.us
Views: Raw Message | Whole Thread | Download mbox | Resend email
Lists: pgsql-admin

Alvaro Herrera <alvherre(at)commandprompt(dot)com> writes:
> Erwin Brandstetter escribi:
>> If I want to change the default order of two columns of a table, can I
>> just manipulate the values in
>> pg_catalog.pg_attribute.attnum?

> It works -- as long as the table is empty.

And as long as you have no views, foreign keys, indexes, defaults,
rules, etc etc etc referencing the columns.

Short answer is don't even think of trying it.

regards, tom lane


From: Erwin Brandstetter <brsaweda(at)gmail(dot)com>
To: pgsql-admin(at)postgresql(dot)org
Subject: Re: Change order of table-columns in pg_catalog.pg_attribute.attnum
Date: 2007-06-06 15:21:48
Message-ID: 1181143308.525613.238500@q75g2000hsh.googlegroups.com
Views: Raw Message | Whole Thread | Download mbox | Resend email
Lists: pgsql-admin

On Jun 6, 4:59 pm, t(dot)(dot)(dot)(at)sss(dot)pgh(dot)pa(dot)us (Tom Lane) wrote:
> Alvaro Herrera <alvhe(dot)(dot)(dot)(at)commandprompt(dot)com> writes:
> > Erwin Brandstetter escribi:
> >> If I want to change the default order of two columns of a table, can I
> >> just manipulate the values in
> >> pg_catalog.pg_attribute.attnum?
> > It works -- as long as the table is empty.
>
> And as long as you have no views, foreign keys, indexes, defaults,
> rules, etc etc etc referencing the columns.
>
> Short answer is don't even think of trying it.

Thanks for your answers.
I had tried it with data in the table and it seemed to work, but it
does mess up views referencing the table. So, no go.

The only way to change the default order of columns is still to drop
the table and all references to it and recreate it all?

Regards
Erwin


From: "Igor Neyman" <ineyman(at)perceptron(dot)com>
To: "Erwin Brandstetter" <brsaweda(at)gmail(dot)com>, <pgsql-admin(at)postgresql(dot)org>
Subject: Re: Change order of table-columns in pg_catalog.pg_attribute.attnum
Date: 2007-06-06 15:50:52
Message-ID: F4C27E77F7A33E4CA98C19A9DC6722A201F76CE1@EXCHANGE.corp.perceptron.com
Views: Raw Message | Whole Thread | Download mbox | Resend email
Lists: pgsql-admin

More important question would be, why would you want to do this (change columns order)?
I can't think of any valid reason for this.

Igor Neyman

-----Original Message-----
From: pgsql-admin-owner(at)postgresql(dot)org [mailto:pgsql-admin-owner(at)postgresql(dot)org] On Behalf Of Erwin Brandstetter
Sent: Wednesday, June 06, 2007 11:22 AM
To: pgsql-admin(at)postgresql(dot)org
Subject: Re: [ADMIN] Change order of table-columns in pg_catalog.pg_attribute.attnum

On Jun 6, 4:59 pm, t(dot)(dot)(dot)(at)sss(dot)pgh(dot)pa(dot)us (Tom Lane) wrote:
> Alvaro Herrera <alvhe(dot)(dot)(dot)(at)commandprompt(dot)com> writes:
> > Erwin Brandstetter escribió:
> >> If I want to change the default order of two columns of a table,
> >> can I just manipulate the values in pg_catalog.pg_attribute.attnum?
> > It works -- as long as the table is empty.
>
> And as long as you have no views, foreign keys, indexes, defaults,
> rules, etc etc etc referencing the columns.
>
> Short answer is don't even think of trying it.

Thanks for your answers.
I had tried it with data in the table and it seemed to work, but it does mess up views referencing the table. So, no go.

The only way to change the default order of columns is still to drop the table and all references to it and recreate it all?

Regards
Erwin

---------------------------(end of broadcast)---------------------------
TIP 1: if posting/reading through Usenet, please send an appropriate
subscribe-nomail command to majordomo(at)postgresql(dot)org so that your
message can get through to the mailing list cleanly