¿Cómo puedo especificar la posición para una nueva columna en PostgreSQL?

75

Si tengo una tabla con las columnas:

id | name | created_date

y me gustaría agregar una columna, yo uso:

alter table my_table add column email varchar(255)

Luego, la columna se agrega después de la created_datecolumna.

¿Hay alguna forma de especificar la posición de la nueva columna? Por ejemplo, puedo agregarlo después namey obtener una tabla como:

id | name | email | created_date
Jonas
fuente
44
No hay necesidad de hacer eso. Simplemente colóquelos en su declaración de selección en el orden que desee.
a_horse_with_no_name
@jonas para que también pueda crear un viewprograma que lo muestre en ese orden ... técnicamente, la posición de la columna no debería importar, ya que puede definirlos en cualquier orden en una consulta ... y generalmente no debería hacer unselect *
xenoterracide
2
@a_horse: Bueno, es mucho más difícil trabajar (como desarrollador / administrador) con las tablas cuando las columnas tienen muchos pedidos diferentes. Cuando tengo 15 columnas en una tabla, realmente prefiero tenerlas en el mismo orden en todas las bases de datos.
Jonas
2
@jonas puede definir nombres de columna al hacer inserciones y actualizaciones y, por lo tanto, hacer que el orden sea irrelevante.
xenoterracide
2
@Jonas: luego escriba su propia alternativa a \ d que informe las columnas en el orden que desee (es solo una consulta en las tablas del sistema: intente usar el psql -Einterruptor para ver la consulta real)
Jack Douglas

Respuestas:

54

ALTER TABLE ADD COLUMNsolo agregará la nueva columna al final, como la última. Para crear una nueva columna en otra posición, debe volver a crear la tabla y copiar los datos de la tabla anterior / actual en esta nueva tabla.

Mariana
fuente
44
Así es ... pero ¿alguien realmente usa este método? :-)
Marian
2
Si es más fácil que recrear la tabla y todas las tablas secundarias , claves externas y subvenciones :) Pensé que el enlace podría ser útil de cualquier manera, ya que ofrece una explicación de por qué no puede especificar la posición y espero que pueda implementarse en un versión futura
Jack Douglas
22

Tendrá que volver a crear la tabla si desea un cierto orden. Solo haz algo como:

alter table tablename rename to oldtable;
create table tablename (column defs go here);
insert into tablename (col1, col2, col3) select col2, col1, col3 from oldtable;

Cree índices según sea necesario, etc.

Scott Marlowe
fuente
2

Si desea esto solo por apariencia, me resulta más fácil mantener una vista por cada tabla con el orden deseado de columnas, y seleccionarla en lugar de la tabla.

create table my_table (
create view view_my_table as
  select id, name, created_date from my_table;

-- adding a new column
begin;
alter table my_table add column email varchar(255);
drop view view_my_table;
create view view_my_table as
  select id, name, email, created_date from my_table;
commit;

Para todos los demás propósitos (como inserción, unión), es mejor especificar siempre la lista de columnas.

-- bad
insert into my_table values (...);
(select * from my_table)
  union all
(select * from my_table);

-- good
insert into my_table (id, name, email, created_date) values (...);
(select id, name, email, created_date from my_table)
  union all
(select id, name, email, created_date from my_table);
Simon Perepelitsa
fuente