Como faço para alterar a posição de uma coluna em uma tabela de banco de dados PostgreSQL?

votos
61

Eu tentei o seguinte, mas não teve sucesso:

ALTER TABLE person ALTER COLUMN dob POSITION 37;
Publicado 13/11/2008 em 00:05
fonte usuário
Em outras línguas...                            


8 respostas

votos
65

" Alterar a posição da coluna " no PostgreSQL Wiki diz:

PostgreSQL actualmente define a ordem das colunas com base na attnumcoluna da pg_attributetabela. A única forma de alterar a ordem das colunas é quer por recriar a mesa, ou através da adição de colunas e de rotação de dados até chegar a disposição desejada.

Isso é muito fraco, mas em sua defesa, no padrão SQL, não há solução para o reposicionamento de uma coluna qualquer. Banco de Dados marcas que suporta a alteração da posição ordinal de uma coluna está definindo uma extensão de sintaxe SQL.

Uma outra idéia me ocorre: você pode definir uma VIEWque especifica a ordem das colunas como você gosta, sem alterar a posição física da coluna na tabela base.

Respondeu 13/11/2008 em 00:08
fonte usuário

votos
6

Eu não acho que você pode pelo presente: veja este artigo na wiki PostgreSQL .

As três soluções alternativas deste artigo são:

  1. Recrie a tabela
  2. Adicione colunas e mover dados
  3. Esconder as diferenças com uma vista.
Respondeu 13/11/2008 em 00:09
fonte usuário

votos
13

Este post é antigo e provavelmente resolvido, mas eu tive o mesmo problema. Resolvi-lo, criando uma visão da tabela original, especificando a nova ordem coluna.

A partir daqui eu poderia usar tanto a vista ou criar uma nova tabela a partir da visão.

    CREATE VIEW original_tab_vw AS
    a.col1 SELECT, a.col3, a.col4, a.col2
    DE original_tab um
    ONDE a.col1 IS NOT NULL --ou seja qual for
    SELECT * INTO new_table DE original_tab_vw

Renomear ou apagar a tabela original e definir o nome da nova tabela para a tabela antiga.

Respondeu 09/01/2014 em 20:01
fonte usuário

votos
5

Abra a tabela no pgadmin e no painel de SQL na parte inferior copiar o SQL CREATE TABLE. Em seguida, abra a ferramenta de consulta e colar. Se a tabela tem dados, altere o nome da tabela para 'new_name', se não, apagar o comentário "-" na linha Drop Table. Editar a sequência de coluna, conforme necessário. Cuidado com a falta vírgula / supérfluo na última coluna no caso de você ter movido-lo. Executar o novo SQL comando CREATE TABLE. Refrescar e ... voilà.

Para mesas vazias na fase de concepção deste método é bastante prático.

No caso da tabela tem dados, que precisa de reorganizar a sequência dos dados da coluna bem. Esta é fácil: usar INSERT IGNORE para importar a tabela antiga para sua nova versão com

INSERÇÃO IGNORE INTO nova (C2, C3, c1) SELECT * FROM de idade;

onde C2, C3, C1 são os c1 colunas, C2, C3 da velha mesa em suas novas posições. Por favor note que, neste caso, você deve usar um 'novo' nome para a tabela editado 'velho', ou você perderá seus dados . No caso dos nomes das colunas são de uso muito, muito tempo e / ou complexo do mesmo método acima para copiar a nova estrutura de tabela em um editor de texto, e criar a nova lista de coluna antes de copiá-lo para o INSERT IGNORE comunicado.

Depois de verificar que tudo está bem, gota a tabela antiga e mudar o 'novo' nome para 'velho' usando ALTER TABLE nova RENAME TO idade; e está feito.

Respondeu 11/01/2015 em 10:56
fonte usuário

votos
8

Um, embora uma opção desajeitado para reorganizar as colunas quando a ordem coluna deve absolutamente ser mudado, e as chaves estrangeiras estão em uso, é a primeira a despejar todo o banco de dados com os dados, em seguida, despejar apenas o esquema ( pg_dump -s databasename > databasename_schema.sql). Próxima edição o arquivo de esquema para reorganizar as colunas como você gostaria, em seguida, recriar o banco de dados do esquema, e, finalmente, restaurar os dados no banco de dados recém-criado.

Respondeu 22/12/2015 em 08:56
fonte usuário

votos
4

No PostgreSQL, enquanto a adição de um campo seria adicionado no fim da tabela. Se precisamos inserir em determinada posição, em seguida,

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;
Respondeu 29/09/2016 em 22:44
fonte usuário

votos
0

Eu uso Django e que exige coluna id em cada tabela se você não quer ter uma dor de cabeça. Infelizmente, eu estava descuidado e minha mesa bp.geo_location_vague não continha neste campo. I rubricado pequeno truque. Passo 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

Passo 2: (! Sem criar a tabela - a tabela criará de forma automática)

SELECT * into bp.geo_location_vague_cp2 FROM bp.geo_location_vague_vw

Etapa 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 eu preciso ter pseudotipo bigserial na tabela. Depois SELECT * em pg criará bigint bigserial tipo insetad.

Passo 4: Agora podemos abandonar a visão, queda tabela de origem e renomeie a nova tabela no nome antigo. O truque foi encerrada com sucesso.

Respondeu 16/08/2019 em 09:10
fonte usuário

votos
0

Há algumas soluções alternativas para tornar possível:

  1. Recriando a tabela inteira

  2. Criar novas colunas dentro da tabela atual

  3. Criar uma vista

https://tableplus.com/blog/2018/09/postgresql-is-it-possible-to-alter-column-order-position-in-a-table.html

Respondeu 18/02/2020 em 12:34
fonte usuário

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more