Tentei o seguinte, mas não tive sucesso:
ALTER TABLE person ALTER COLUMN dob POSITION 37;
Tentei o seguinte, mas não tive sucesso:
ALTER TABLE person ALTER COLUMN dob POSITION 37;
Respostas:
" Alterar a posição da coluna " no PostgreSQL Wiki diz:
O PostgreSQL atualmente define a ordem das colunas com base na
attnum
coluna dapg_attribute
tabela. A única maneira de alterar a ordem das colunas é recriar a tabela ou adicionar colunas e girar os dados até atingir o layout desejado.
Isso é muito fraco, mas em sua defesa, no SQL padrão, também não há solução para reposicionar uma coluna. As marcas de banco de dados que oferecem suporte à alteração da posição ordinal de uma coluna estão definindo uma extensão para a sintaxe SQL.
Outra ideia me ocorre: você pode definir um VIEW
que especifica a ordem das colunas como você gosta, sem alterar a posição física da coluna na tabela base.
No PostgreSQL, ao adicionar um campo, ele seria adicionado no final da tabela. Se precisarmos inserir em uma posição particular, então
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;
Este post é antigo e provavelmente está resolvido, mas eu tive o mesmo problema. Resolvi isso criando uma visão da tabela original especificando a nova ordem das colunas.
A partir daqui, eu poderia usar a visualização ou criar uma nova tabela a partir da visualização.
CRIAR VISUALIZAR original_tab_vw AS SELECIONE a.col1, a.col3, a.col4, a.col2 FROM original_tab a ONDE a.col1 NÃO É NULO - ou qualquer outra coisa
SELECT * INTO new_table FROM original_tab_vw
Renomeie ou elimine a tabela original e defina o nome da nova tabela para a tabela antiga.
Uma, embora seja uma opção desajeitada para reorganizar as colunas quando a ordem das colunas deve ser absolutamente alterada e as chaves estrangeiras estão em uso, é primeiro despejar todo o banco de dados com dados e, em seguida, despejar apenas o esquema ( pg_dump -s databasename > databasename_schema.sql
). Em seguida, edite o arquivo de esquema para reorganizar as colunas como desejar, recrie o banco de dados do esquema e, finalmente, restaure os dados no banco de dados recém-criado.
Não acho que você possa no momento: veja este artigo na wiki do Postgresql .
As três soluções alternativas deste artigo são:
Abra a tabela no PGAdmin e no painel SQL na parte inferior copie a instrução SQL Create Table. Em seguida, abra a ferramenta de consulta e cole. Se a tabela tiver dados, altere o nome da tabela para 'novo_nome', caso contrário, exclua o comentário "-" na linha Eliminar Tabela. Edite a sequência da coluna conforme necessário. Cuidado com a vírgula ausente / supérflua na última coluna, caso você a tenha movido. Execute o novo comando SQL Create Table. Atualize e ... voilà.
Para tabelas vazias na fase de design, este método é bastante prático.
Caso a tabela contenha dados, precisamos reorganizar a sequência das colunas dos dados também. Isso é fácil: use INSERT
para importar a tabela antiga para sua nova versão com:
INSERT INTO new ( c2, c3, c1 ) SELECT * from old;
... onde c2
, c3
, c1
são as colunas c1
, c2
, c3
da antiga mesa em suas novas posições. Observe que, neste caso, você deve usar um nome 'novo' para a tabela 'antiga' editada ou perderá seus dados . No caso dos nomes das colunas serem muitos, longos e / ou complexos, use o mesmo método acima para copiar a nova estrutura da tabela em um editor de texto e crie a nova lista de colunas antes de copiá-la para a INSERT
instrução.
Depois de verificar se está tudo bem, DROP
vá para a tabela antiga e mude o nome 'novo' para 'antigo' usando ALTER TABLE new RENAME TO old;
e pronto.
Eu estava trabalhando para reordenar várias tabelas e não queria ter que escrever as mesmas consultas repetidamente, então fiz um script para fazer tudo para mim. Essencialmente, ele:
pg_dump
pg_dump
consulta original para criar uma tabela reordenada com dadosEle pode ser usado executando o seguinte comando simples:
./reorder.py -n schema -d database table \
first_col second_col ... penultimate_col ultimate_col --migrate
Ele imprime o sql para que você possa verificá-lo e testá-lo, esse foi um grande motivo pelo qual eu o baseei pg_dump
. Você pode encontrar o repositório github aqui .
Eu uso Django e requer coluna id em cada tabela se você não quiser ter dor de cabeça. Infelizmente, fui descuidado e minha tabela bp.geo_location_vague não continha este campo. Eu iniciei um 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
Etapa 2: (sem criar tabela - a tabela será criada automaticamente!)
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 preciso ter um grande pseudótipo serial na tabela. Depois de SELECT * na pg, será criado o tipo bigint insetad bigserial.
passo 4: agora podemos eliminar a visão, eliminar a tabela de origem e renomear a nova tabela com o nome antigo. O truque foi encerrado com sucesso.
Existem algumas soluções alternativas para tornar isso possível:
Recriando a mesa inteira
Crie novas colunas na tabela atual
Crie uma vista