una tabla postgres posicion ordenar orden nombre modificar las insertar eliminar como columnas columna campo cambiar agregar postgresql

tabla - insertar columna en postgresql



¿Es posible cambiar el orden natural de las columnas en Postgres? (7)

¿Es posible cambiar el orden natural de las columnas en Postgres 8.1?

Sé que no debes confiar en el orden de las columnas, no es esencial para lo que estoy haciendo, solo lo necesito para hacer que algunas cosas generadas automáticamente salgan de una manera que sea más agradable, de modo que el orden de campo coincida con todo el desde pgadmin a través del back end y hacia el frente.


Como las otras respuestas mencionadas, no puedes cambiar el orden de las columnas, eso depende de postgres. Puede (¡y debería!) Resolver su problema con una vista. A los efectos de su consulta de informes, se verá como una tabla. Algo como:

create view my_view as select * from my_table order by some_col;


Lamentablemente, no, no lo es. El orden de la columna depende por completo de Postgres.


Especificar el orden de las columnas en la consulta es la única manera confiable (y sensata) . Dicho esto, normalmente puede obtener un pedido diferente alterando la tabla como se muestra en el ejemplo a continuación, ya que las columnas normalmente (no se garantiza que lo sean) se devuelven en el orden en que se agregaron a la tabla.

postgres=# create table a(a int, b int, c int); CREATE TABLE postgres=# insert into a values (1,2,3); INSERT 0 1 postgres=# select * from a; a | b | c ---+---+--- 1 | 2 | 3 (1 row) postgres=# alter table a add column a2 int; ALTER TABLE postgres=# select * from a; a | b | c | a2 ---+---+---+---- 1 | 2 | 3 | (1 row) postgres=# update a set a2 = a; UPDATE 1 postgres=# alter table a drop column a; ALTER TABLE postgres=# alter table a rename column a2 to a; ALTER TABLE postgres=# select * from a; b | c | a ---+---+--- 2 | 3 | 1 (1 row) postgres=#


De hecho, puede cambiar directamente el orden de las columnas, pero apenas lo recomendaría, y debe tener mucho cuidado si decide hacerlo.

p.ej.

# 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)

Ahora, por el truco, necesitas conectarte a tu base de datos usando el usuario postgres para que puedas modificar las tablas del sistema.

# SELECT relname, relfilenode FROM pg_class WHERE relname=''test''; relname | relfilenode ---------+------------- test_t | 27666 (1 row) # 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 | b | 1 27666 | a | 2 27666 | c | 3 (9 rows)

attnum es una columna única, por lo que debe usar un valor temporal cuando modifique los números de columna como tales:

# 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 # SELECT * FROM test; b | a | c ---+---+--- 1 | 2 | 3 (1 row)

Nuevamente, debido a que esto es jugar con las tablas del sistema de la base de datos, tenga mucho cuidado si siente que realmente necesita hacer esto.

Esto funciona desde Postgres 8.3, con versiones anteriores, su kilometraje puede variar.


Hice esa pregunta en pgsql-admin en 2007. Tom Lane mismo declaró que era prácticamente inviable cambiar el orden en los catálogos. Aclaración: .. para usuarios, con las herramientas actuales (sigue siendo cierto para v9.1). No significa que no podría ser implementado. OMI, debería ser.
http://archives.postgresql.org/pgsql-admin/2007-06/msg00037.php


Si su base de datos no es muy grande y puede permitirse un tiempo de inactividad, puede:

  1. Desactivar el acceso de escritura a la base de datos
    esto es esencial ya que de lo contrario se perderán los cambios después de comenzar el próximo punto
  2. pg_dump --create --column-inserts databasename > databasename.pgdump.sql
  3. Edite la instrucción CREATE TABLE apropiada en databasename.pgdump.sql
    Si el archivo es demasiado grande para su editor simplemente divídalo usando el comando split , edite y luego vuelva a ensamblar usando el cat
  4. drop database databasename
    Usted tiene una copia de seguridad reciente, por si acaso, ¿verdad?
  5. psql --single-transaction -f databasename.pgdump.sql
    Si no usas --single-transaction , será muy lento

Si usa los llamados objetos grandes, asegúrese de que estén incluidos en el volcado. No estoy seguro de si están por defecto en 8.1.


Puede obtener el orden de las columnas que desee creando una nueva tabla y seleccionando las columnas de la tabla anterior en el orden que desea que presenten:

CREATE TABLE test_new AS SELECT b, c, a FROM test; SELECT * from test_new; b | c | a ---+---+--- 2 | 3 | 1 (1 row)

Tenga en cuenta que esto solo copia datos, no modificadores, restricciones, índices, etc.

Una vez que la nueva tabla se modifique de la manera que desee, suelte el original y modifique el nombre del nuevo:

BEGIN; DROP TABLE test; ALTER TABLE test_new RENAME TO test; COMMIT;