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:
- 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 -
pg_dump --create --column-inserts databasename > databasename.pgdump.sql
- 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 comandosplit
, edite y luego vuelva a ensamblar usando elcat
-
drop database databasename
Usted tiene una copia de seguridad reciente, por si acaso, ¿verdad? -
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;