Eu tentei o seguinte, mas não teve sucesso:
ALTER TABLE person ALTER COLUMN dob POSITION 37;
Eu tentei o seguinte, mas não teve sucesso:
ALTER TABLE person ALTER COLUMN dob POSITION 37;
" Alterar a posição da coluna " no PostgreSQL Wiki diz:
PostgreSQL actualmente define a ordem das colunas com base na
attnumcoluna dapg_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.
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:
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.
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.
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.
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;
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.
Há algumas soluções alternativas para tornar possível:
Recriando a tabela inteira
Criar novas colunas dentro da tabela atual
Criar uma vista