No meu banco de dados PostgreSQL:
select index from sample;
index
---------
1
2
3
1
2
Eu quero colocar o index
seguinte:
select index from sample;
index
---------
1
2
3
4
5
Saddam Khan forneceu uma maneira de resolvê-lo:
alter table sample add column sort_id serial;
-- Drop column index from sample table.
alter table sample drop column index;
-- Rename column sort_id to index in sample table
alter table sample rename column sort_id to index;
-- Add Primary Key.
alter table sample add primary key(index);
Mas agora, a index
coluna está do lado direito (final da tabela). Como posso colocá-lo no lado esquerdo?
select * from sample;
ticker | roe | income | index
--------+---------+---------+-------
000820 | 2347.63 | 120.16 | 1
300071 | 676.52 | 1035.38 | 2
002188 | 289.69 | 273.95 | 3
600734 | 151.58 | 921.82 | 4
000523 | 139.94 | 2585.55 | 5
600078 | 138.28 | 3333.41 | 6
Os campos de chave primária devem ser exclusivos, não sequenciais. Se você tiver algum tipo de processamento que dependa de algo ser "pedido", não conte com a Chave Primária para fornecê-lo.
Você pode imaginar o caos se o seu banco renumerasse as contas correntes das pessoas toda vez que alguém fechasse a conta? É uma ideia muito, muito ruim. Além disso, assim que você tiver chaves estrangeiras referenciando essas chaves primárias, o banco de dados realmente deve impedir que você faça isso (e não; alterações em "cascata" não são a resposta. A quantidade de trabalho que o banco de dados precisa fazer para fazer essas alterações cresce exponencialmente com cada nova tabela de referência e todas as linhas nelas).
Por que você acha que isso importa?
Cada instrução SELECT que você escreve deve especificar as colunas que deseja, na ordem em que deseja. Nunca confie no layout da tabela física porque, como você descobriu, ele pode mudar .
Bancos de dados são entidades inerentemente compartilhadas e você nunca sabe quem [mais] fará o quê neles (ou para eles).
Você pode alterar a coluna para uma
identity
coluna e atualizar os valores com base na sequência subjacente.Agora foi gerada uma sequência que pode ser usada para atualizar os valores existentes para torná-los únicos:
Em seguida, torne a coluna a chave primária:
Novas colunas são adicionadas ao final da lista de colunas com
ALTER TABLE
. Você precisa recriar a tabela para obter a ordem desejada das colunas.Ou
UPDATE
a coluna existente no local, o que é um pouco complicado na presença de uma restriçãoUNIQUE
ouPRIMARY KEY
(enquanto possível).Ambos são caros (para grandes mesas) e bloqueados. A primeira opção pode ser ainda mais barata no geral, embora mais invasiva. Normalmente, um problema para bancos de dados com acesso simultâneo. Não é um problema se você for o único usuário.
Se você for escrever uma nova tabela, faça isso em vez de tudo o que está mostrando acima.
Quaisquer referências internas à tabela antiga devem ser eliminadas e recriadas. Como chaves estrangeiras, visualizações etc.
A nova
IDENTITY
coluna é preenchida com números incrementados automaticamente a partir de seu anexoSEQUENCE
automaticamente, se não for direcionado naINSERT
instrução. Ver: