Intenté lo siguiente, pero no tuve éxito:
ALTER TABLE person ALTER COLUMN dob POSITION 37;
Intenté lo siguiente, pero no tuve éxito:
ALTER TABLE person ALTER COLUMN dob POSITION 37;
Respuestas:
" Alterar la posición de la columna " en el Wiki de PostgreSQL dice:
PostgreSQL actualmente define el orden de las
attnum
columnas según la columna de lapg_attribute
tabla. La única forma de cambiar el orden de las columnas es recreando la tabla o agregando columnas y rotando datos hasta llegar al diseño deseado.
Eso es bastante débil, pero en su defensa, en SQL estándar, tampoco hay una solución para reposicionar una columna. Las marcas de bases de datos que admiten el cambio de la posición ordinal de una columna están definiendo una extensión de la sintaxis SQL.
Se me ocurre otra idea: puedes definir un VIEW
que especifique el orden de las columnas como más te guste, sin cambiar la posición física de la columna en la tabla base.
En PostgreSQL, al agregar un campo, se agregaría al final de la tabla. Si necesitamos insertar en una posición particular, entonces
alter table tablename rename to oldtable;
create table tablename (column defs go here);
insert into tablename (col1, col2, col3) select col1, col2, col3 from oldtable;
Esta publicación es antigua y probablemente esté resuelta, pero tuve el mismo problema. Lo resolví creando una vista de la tabla original especificando el nuevo orden de columna.
Desde aquí, podría usar la vista o crear una nueva tabla desde la vista.
CREAR VER original_tab_vw COMO SELECCIONE a.col1, a.col3, a.col4, a.col2 FROM original_tab a DONDE a.col1 NO ES NULO - o lo que sea
SELECT * INTO new_table FROM original_tab_vw
Cambie el nombre o elimine la tabla original y establezca el nombre de la tabla nueva en la tabla anterior.
Una, aunque una opción torpe para reorganizar las columnas cuando el orden de las columnas debe cambiarse absolutamente y las claves externas están en uso, es primero volcar toda la base de datos con datos y luego volcar solo el esquema ( pg_dump -s databasename > databasename_schema.sql
). A continuación, edite el archivo de esquema para reorganizar las columnas como desee, luego vuelva a crear la base de datos a partir del esquema y, finalmente, restaure los datos en la base de datos recién creada.
No creo que pueda en este momento: vea este artículo en la wiki de Postgresql .
Las tres soluciones alternativas de este artículo son:
Abra la tabla en PGAdmin y en el panel SQL en la parte inferior copie la declaración SQL Create Table. Luego abra la Herramienta de consulta y péguela. Si la tabla tiene datos, cambie el nombre de la tabla a 'new_name', de lo contrario, elimine el comentario "-" en la línea Drop Table. Edite la secuencia de columnas según sea necesario. Tenga en cuenta la coma faltante / superflua en la última columna en caso de que la haya movido. Ejecute el nuevo comando SQL Create Table. Refresca y ... voilà.
Para tablas vacías en la etapa de diseño, este método es bastante práctico.
En caso de que la tabla tenga datos, también debemos reorganizar la secuencia de columnas de los datos. Esto es fácil: use INSERT
para importar la tabla anterior a su nueva versión con:
INSERT INTO new ( c2, c3, c1 ) SELECT * from old;
... donde c2
, c3
, c1
son las columnas c1
, c2
, c3
de la mesa de edad en sus nuevas posiciones. Tenga en cuenta que en este caso debe utilizar un nombre "nuevo" para la tabla "antigua" editada o perderá sus datos . En caso de que los nombres de las columnas sean muchos, largos y / o complejos, use el mismo método que el anterior para copiar la nueva estructura de la tabla en un editor de texto y cree la nueva lista de columnas allí antes de copiarla en la INSERT
declaración.
Después de comprobar que todo está bien, DROP
utilice la tabla antigua y cambie el nombre 'nuevo' a 'antiguo' ALTER TABLE new RENAME TO old;
y ya está.
Estaba trabajando en reordenar muchas tablas y no quería tener que escribir las mismas consultas una y otra vez, así que hice un script para hacerlo todo por mí. Esencialmente,
pg_dump
pg_dump
consulta original para crear una tabla reordenada con datos.Se puede utilizar ejecutando el siguiente comando simple:
./reorder.py -n schema -d database table \
first_col second_col ... penultimate_col ultimate_col --migrate
Imprime el sql para que pueda verificarlo y probarlo, esa fue una gran razón en la que lo basé pg_dump
. Puedes encontrar el repositorio de github aquí .
Yo uso Django y requiere una columna de identificación en cada tabla si no quieres tener un dolor de cabeza. Desafortunadamente, fui descuidado y mi tabla bp.geo_location_vague no contenía este campo. Puse mis iniciales en un pequeño truco. Paso 1:
CREATE VIEW bp.geo_location_vague_vw AS
SELECT
a.id, -- I change order of id column here.
a.in_date,
etc
FROM bp.geo_location_vague a
Paso 2: (sin crear tabla, ¡la tabla se creará automáticamente!)
SELECT * into bp.geo_location_vague_cp2 FROM bp.geo_location_vague_vw
Paso 3:
CREATE SEQUENCE bp.tbl_tbl_id_seq;
ALTER TABLE bp.geo_location_vague_cp2 ALTER COLUMN id SET DEFAULT nextval('tbl_tbl_id_seq');
ALTER SEQUENCE bp.tbl_tbl_id_seq OWNED BY bp.geo_location_vague_cp2.id;
SELECT setval('tbl_tbl_id_seq', COALESCE(max(id), 0)) FROM bp.geo_location_vague_cp2;
Porque necesito tener un pseudotipo de serie grande en la mesa. Después de SELECCIONAR * en pg, se creará un tipo bigint insertado en bigserial.
Paso 4: Ahora podemos eliminar la vista, eliminar la tabla de origen y cambiar el nombre de la nueva tabla con el nombre anterior. El truco se terminó con éxito.
Hay algunas soluciones para hacerlo posible:
Recreando toda la mesa
Crea nuevas columnas dentro de la tabla actual
Crea una vista