Introducción
Una de las cosas que siempre me ha gustado de MySQL es que es muy fácil ordenar las columnas de una tabla.
De hecho, es algo muy práctico si estas definiendo el modelo pero no tienes claras algunas cosas o vas añadiendo cosas sobre la marcha. Un simple ALTER de la tabla y listo.
En PostgreSQL es otra historia.
Según podemos leer en la wiki oficial de PostgreSQL, para reordenar las columnas en una tabla debemos recrear la tabla entera.
Cuando leí esta información me soprendió un poco ya que en algunos casos, sobre todo en tablas muy grandes, esto puede ser muy complicado a la par que peligroso.
Existen soluciones para evitar recrear toda la tabla pero se basan en crear vistas y tampoco es una opción en muchos casos.
La solución: Usar una tabla temporal
1. Convertir la tabla en una tabla temporal
Como queremos mantener los nombres de tabla y preservar los datos, primero convertiremos la tabla en una tabla temporal para posteriormente trabajar con ella:
ALTER TABLE usuarios
RENAME TO temp_usuarios;
2. Crear la tabla nueva
Una vez tenemos la tabla temporal, creamos la tabla destino, es decir la tabla final que contenga las columnas en el orden que nosotros queremos:
CREATE TABLE usuarios
(
nombre text,
apellidos text
dni timestamp
...
)
3. Copiar los datos de la tabla temporal a la nueva tabla
Una vez hemos creado la tabla final nos queda transferir los datos de la tabla temporal a la nueva tabla (la que hemos definido con las columnas ordenadas):
INSERT INTO usuarios (nombre, apellidos, dni, ...) SELECT nombre, apellidos, dni FROM temp_usuarios;
Conclusión
A día de hoy no existe una opción oficial de PostgreSQL para reordenar columnas. La opción más simple es convertir la tabla original en temporal y traspasar los datos a la nueva tabla con las columnas ordenadas.
Espero que te guste el post ya que te puede ahorrar muchas horas 🙂