cablop.net – Software Tips

Tips de software, hardware… y algo más

Skip to: Content | Sidebar | Footer

Como cambiar el orden de las columnas en PostgreSQL

29 Agosto, 2009 (11:10) | PostgreSQL 8.3, SQL | By: 天龙

Este está tomado de la siguiente pregunta en stackoverflow.com: Is it possible to change the natural order of columns in Postgres?.

El procedimiento es simple, aunque no lo recomiendan para usuarios inexpertos o poco cuidadosos. Incluso, debería omitirse esto si no es estrictamente necesario el cambio (las posibilidades de arruinar el sistema son altas). en Eo personal también lo recomiendo solo si es obligatorio.

Como cambiar el orden de las columnas de una tabla en PostgreSQL

0. Como base, tenemos una tabla de ejemplo

# CREATE TABLE test (a int, b int, c int);
# INSERT INTO test VALUES (1,2,3);
# SELECT * FROM test;
 a | b | c
---+---+---
 1 | 2 | 3
(1 row)

Queremos que la columna b quede antes que la columna a.

1. Nos logeamos en la base de datos con el usuario postgres para poder editar las tablas de sistema.

2. Buscamos el valor attrelid de la tabla que queremos modificar en la tabla pg_class:

# SELECT relname, relfilenode FROM pg_class WHERE relname='test';
 relname | relfilenode
---------+-------------
 test_t  |       27666
(1 row)

Luego consultamos la tabla pg_attribute para encontrar la tabla, las columnas y la posición de las columnas, con el valor que nos retornó la búsqueda anterior.

# SELECT attrelid, attname, attnum FROM pg_attribute WHERE attrelid=27666;
 attrelid | attname  | attnum
----------+----------+--------
    27666 | tableoid |     -7
    27666 | cmax     |     -6
    27666 | xmax     |     -5
    27666 | cmin     |     -4
    27666 | xmin     |     -3
    27666 | ctid     |     -1
    27666 | a        |      1
    27666 | b        |      2
    27666 | c        |      3
(9 rows)

Aquí podemos tener un problema y es que puede que el primer comando no nos retorne nada o nos retorne un valor diferente al que buscamos. De no encontrar la tabla con el primer comando, podemos buscar directamente en la tabla pg_attribute por el nombre de nuestra columna, si este no es común a otras tablas y verificando cuidadosamente que la tabla que buscamos es la que nos interesa.

# SELECT attrelid, attname, attnum FROM pg_attribute WHERE attname=a;
 attrelid | attname  | attnum
----------+----------+--------
    27666 | a        |      1
(1 rows)

3. Modificamos el valor de attnum de las columnas.

Ya que attnum es una columna de valores únicos (en realidad yo creo que se trata de un constraint compuesto), tenemos que usar un valor temporal mientras modificamos el valor.

# UPDATE pg_attribute SET attnum=4 WHERE attname='a' AND attrelid=27666;
UPDATE 1
# UPDATE pg_attribute SET attnum=1 WHERE attname='b' AND attrelid=27666;
UPDATE 1
# UPDATE pg_attribute SET attnum=2 WHERE attname='a' AND attrelid=27666;
UPDATE 1

Luego consultamos la tabla para saber que hicimos las cosas bien

# SELECT * FROM test;
 b | a | c
---+---+---
 1 | 2 | 3
(1 row)

No sobra recordar que estamos modificando las tablas de sistema, entonces debemos ser muy cuidadosos.

Esto funciona muy bien para PostgreSQL 8.3 (lo tuve que utilizar una sola vez). No sé si para otras versiones, sobre todo las anteriores, el truco también funcione.

Nota.- El contenido de la página original esta bajo una licencia Creative Commons Atribución, Compartir Igual y este artículo se ofrece bajo la misma licencia.

Comments

Comment from Jaime Casanova
Time 2010.01.13 at 00:49

Esto no funciona, si los tipos de datos son distintos PostgreSQL fallara feamente, aun en este caso en el que los tipos de datos son identicos lo que se hizo fue cambiar a la columna a por el nombre b y viceversa… por eso en el resultado final b tiene 1 y a tiene 2

Comment from Luis
Time 2010.01.13 at 04:46

Atención, que esto no es correcto, solo cambia el nombre pero no los datos, y en caso de ser de distintos tipos corrompe la tabla, antes de publicar algo hay que investigar un poqutin ;-)

Comment from 天龙
Time 2010.02.05 at 11:43

Cuando yo lo usé cambie el orden de columnas de diferente tipo sin inconveniente alguno, pero fue hace ya tiempo…

voy a hacer pruebas a ver

Comment from Ricardo
Time 2011.03.17 at 14:54

Hola, hice lo que comentas pero trae problemas muy serios tanto así que me desactiva el servidor, tengo que volver a iniciarlo. La versión que estoy utilizando es la 8.4.

Write a comment





To submit your comment, click the image below where it asks you to... Clickcha - The One-click Captcha