Cambiar orden de columnas de una tabla en PostgreSQL
miércoles, abril 22, 2020Cuando 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:
- Reconstruir la tabla con ayuda de una tabla temporal.
- Alterar la estructura de la tabla con ayuda de columnas temporales.
- 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:
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:
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:
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:
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.
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