Cambiar orden de columnas de una tabla en PostgreSQL

miércoles, abril 22, 2020
Banner PostgreSQL

Cuando se trata de modificar el orden de las columnas de una tabla en PostgreSQL, nos encontramos con que no hay una forma directa de hacerlo, como sí existe en MySQL y te lo muestro aquí. Respecto a esto no existe una estrategia única, por lo que voy a estar mostrando 3 formas diferentes para lograrlo.

Para todo cambio que vayamos a hacer en la estructura de nuestras tablas, es sumamente importante tener un respaldo actualizado de la misma.

Para cambiar el orden de las columnas de una tabla te voy a mostrar las siguientes formas:

  1. Reconstruir la tabla con ayuda de una tabla temporal.
  2. Alterar la estructura de la tabla con ayuda de columnas temporales.
  3. Usar una vista.

Imaginemos que tenemos la siguiente tabla con algunos datos:

CREATE TABLE personas
(
    id integer,
    apellido varchar(50),
    nombre varchar(50),
    apodo varchar(50),
    CONSTRAINT personas_pkey PRIMARY KEY (id)
);

INSERT INTO personas (id, apellido, nombre, apodo) VALUES
(1, 'Stark', 'Tony', 'Ironman'),
(2, 'Romanoff', 'Natasha', 'Viuda Negra'),
(3, 'Parker', 'Peter', 'Spiderman'),
(4, 'Danvers', 'Carol', 'Capitana Marvel'),
(5, 'Rogers', 'Steven', 'Capitán América'),
(6, 'Banner', 'Bruce', 'Hulk');

 

Se vería de esta manera:

Tabla con orden original

 

Si queremos alterar el orden de esta tabla y llevar la columna apellido después de la columna nombre, podemos usar estas alternativas:

 

Opción 1. Reconstruir la tabla con ayuda de una tabla temporal.

Lo primero que hacemos será crear una tabla temporal para copiar nuestros datos:

//Creamos una tabla temporal
CREATE TABLE personas_copia
(
    id integer,
    apellido varchar(50),
    nombre varchar(50),
    apodo varchar(50),
    CONSTRAINT personas_pkey PRIMARY KEY (id)
);

//Copiamos los datos existentes en la tabla personas
INSERT INTO personas_copia
SELECT * FROM personas;

Luego que aseguramos nuestros datos, podemos borrar la tabla que tiene la estructura que queremos cambiar (si tenemos referencias de otra tabla a la tabla que queremos borrar, primero debemos borrar estas referencias y posteriormente volver a crearlas al finalizar el proceso):

//Borramos la tabla original
DROP TABLE personas;

Seguidamente podemos crear la tabla con las columnas en el orden deseado:

//Crear la tabla ordenada
CREATE TABLE personas
(
    id integer,
    nombre varchar(50),
    apellido varchar(50),
    apodo varchar(50),
    CONSTRAINT personas_pkey PRIMARY KEY (id)
);

Volvemos a copiar nuestros datos:

//Copiamos los datos guardados
INSERT INTO personas
SELECT id, nombre, apellido, apodo FROM personas_copia;

Nos quedaría nuestra tabla ordenada:

Tabla con orden deseado

 

Ahora ya podemos borrar la tabla temporal:

//Borramos la tabla temporal
DROP TABLE personas_copia;

 

Opción 2. Alterar la estructura de la tabla con ayuda de columnas temporales.

El primer paso en esta opción será renombrar todas las columnas que se encuentran desde de la posición donde queremos ordenar la columna (en este caso queremos que ahora nombre este donde esta apellido):

//Renombramos la columna apellido
ALTER TABLE personas
RENAME COLUMN apellido TO apellido_ant;

//Renombramos la columna nombre
ALTER TABLE personas
RENAME COLUMN nombre TO nombre_ant;

//Renombramos la columna apodo
ALTER TABLE personas
RENAME COLUMN apodo TO apodo_ant;

Ahora vamos a crear las columnas en el orden deseado:

//Creamos primero la columna nombre
ALTER TABLE personas
ADD nombre character varying;

//Luego creamos la columna apellido
ALTER TABLE personas
ADD apellido character varying;

//Finalmente creamos la columna apodo
ALTER TABLE personas
ADD apodo character varying;

Luego procedemos a copiar los datos de las columnas originales que cambiamos el nombre, a las nuevas columnas que se encuentran en la nueva posición deseada:

//Copiamos los datos
UPDATE personas SET
nombre = nombre_ant,
apellido = apellido_ant,
apodo = apodo_ant;

 

Nos quedaría hasta el momento de la siguiente manera:

Tabla con columnas temporales

 

Finalmente nos queda borrar las columnas viejas:

//Borramos la columna
ALTER TABLE personas
DROP COLUMN apellido_ant;

//Borramos la columna
ALTER TABLE personas
DROP COLUMN nombre_ant;

//Borramos la columna
ALTER TABLE personas
DROP COLUMN apodo_ant;

 

De esta forma nos quedaría nuestra tabla ordenada:

Tabla con orden deseado

 

Opción 3. Usar una vista.

Aunque esta alternativa no considera modificar la estructura de la tabla en cuestión, en algunos casos será la solución más fácil para obtener una entidad con el orden requerido de forma rápida y segura:

//Creamos una vista con el orden deseado
CREATE VIEW personas_vista AS
SELECT id, nombre, apellido, apodo
FROM personas;

 

Cualquiera de las estrategias mostradas es válida para obtener el objetivo, todo va a depender de la capacidad de maniobra que tengamos con nuestras tablas. ¿Conoces alguna otra manera? Déjamela en los comentarios.

También te puede interesar

Cuando navego por los sitios web, mi parte favorita es leer los comentarios. Es por eso que tus comentarios son un complemento valioso para mis entradas. Cualquier duda o aporte no dejes de escribirlo, en breve lo estaré publicando. ¡Gracias!


0 comentarios

Lo más reciente

¡Bendiciones para mi Venezuela!

¡Bendiciones para mi Venezuela!