Re: Cambiar orden de las columnas

From: Jaime Casanova <jcasanov(at)systemguards(dot)com(dot)ec>
To: Simeó Reig <simeo(at)grupoincofisa(dot)com>
Cc: pgsql-es-ayuda(at)postgresql(dot)org
Subject: Re: Cambiar orden de las columnas
Date: 2010-01-13 06:04:24
Message-ID: 3073cc9b1001122204l588d7ec1made30b1909f378b@mail.gmail.com
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-es-ayuda

2010/1/12 Simeó Reig <simeo(at)grupoincofisa(dot)com>:
> ¿Hay algún método menos 'peligroso' para cambiar el orden de las columnas ?
>
> http://sw.cablop.net/tips/2009/08/29/como-cambiar-el-orden-de-las-columnas-en-postgresql/
>

wow!!! cuantas idioteces se encuentra uno en internet!!!
nunca, repito, nunca hagas esto...

la única razón por la que a el pareció funcionarle es que los tipos de
datos eran los mismo en ambas columnas y aun así todo lo que logró es
cambiarle el nombre a las columnas, pero si te fijas los valores no se
movieron... es decir que los valores de "a" ahora están en "b" y
viceversa

y si los tipos de datos son diferentes el resultado es peor aun:
"""
test=# SELECT * FROM test;
ERROR: could not open relation with OID 0

test=# alter table test alter a type int;
ERROR: invalid memory alloc request size 18446744072475901956
"""

> Creía que no se podía hacer ya que pgadmin no te da la opción, por lo que
> creo que el método mostrado por el link igual no es del todo recomendable,
> ¿que opinais?
>
>

dificilmente el pgadmin decide lo que postgres puede y no puede hacer ;)
el verdadero problema es que la posicion fisica de la columna en disco
es la misma que la posicion logica, asi que hacer el cambio en ese
catalogo solo lograra que intente leer en disco esa columna en la
posicion que le dijimos (por eso el error que da, busca un campo text
de 4+length(string) bytes y encuentra un campo int de 4 bytes, luego
busca un campo int de 4 y encuentra el texto)...

maneras "reales" de solucionar esto:

1) crea una tabla temporal con el orden de las columnas que necesitas;
copia los datos con "insert into ... select ..."; borra la tabla
vieja; renombra la tabla nueva (claro tuviste que haber borrado todos
los constraints e indices antes y reconstruirlos luego)

2) usa pg_dump para hacer un respaldo de la base o quiza solo de la
tabla y arregla el script a mano (incluidos los datos claro)

3) crea una vista con el orden que quieres

4) modifica postgres agregando un campo a pg_attributes para guardar
la posicion fisica de la columna, y envia el parche a
pgsql-hackers(at)postgresql(dot)org

--
Atentamente,
Jaime Casanova
Soporte y capacitación de PostgreSQL
Asesoría y desarrollo de sistemas
Guayaquil - Ecuador
Cel. +59387171157

In response to

Responses

Browse pgsql-es-ayuda by date

  From Date Subject
Next Message Simeó Reig 2010-01-13 09:29:17 Re: Cambiar orden de las columnas
Previous Message Francisco Reyes 2010-01-13 06:00:20 Re: error en esquema public