Eu tenho uma mesa com mais de um milhão de linhas. Preciso redefinir a sequência e reatribuir a coluna id com novos valores (1, 2, 3, 4 ... etc ...). Existe alguma maneira fácil de fazer isso?
postgresql
sequence
Sennin
fonte
fonte
id
não começou a partir de 1. Portanto, a ordem resultou da seguinte forma: 150, 151 ..., 300, 1, 2 ... E causaria erros de identificação duplicados eventualmente, suponho, se não tivesse renumerado os ids. Além disso, ordenar porid
geralmente é melhor que ordenar porcreated_at
. E aqui está o que funcionou para mim .Respostas:
Se você não deseja manter a ordem dos IDs, pode
Duvido que exista uma maneira fácil de fazer isso na ordem de sua escolha, sem recriar toda a tabela.
fonte
ALTER SEQUENCE seq RESTART WITH 1;
?SELECT setval('seq', 1, FALSE)
deve fazer o mesmo (aqui, o terceiro argumento, FALSE, faz a mágica, pois mostra quenextval
deve ser 1 em vez de 2)Com o PostgreSQL 8.4 ou mais recente, não há mais a necessidade de especificar
WITH 1
. O valor inicial que foi registradoCREATE SEQUENCE
ou o último definido porALTER SEQUENCE START WITH
será usado (provavelmente será 1).Redefina a sequência:
Atualize a coluna ID da tabela:
Fonte: Docs do PostgreSQL
fonte
Redefina a sequência:
Atualizando registros atuais:
fonte
serial
eCREATE SEQUENCE
é 1!)Ambas as soluções fornecidas não funcionaram para mim;
setval('seq', 1)
inicia a numeração com 2 e tambémALTER SEQUENCE seq START 1
a numeração com 2, porque seq.is_called é verdadeiro (Postgres versão 9.0.4)A solução que funcionou para mim é:
fonte
Apenas para simplificar e esclarecer o uso adequado do setter ALTER SEQUENCE e SELECT para redefinir a sequência:
é equivalente a
Qualquer uma das instruções pode ser usada para redefinir a sequência e você pode obter o próximo valor por nextval ('sequence_name'), como indicado aqui também:
fonte
A melhor maneira de redefinir uma sequência para começar com o número 1 é executar o seguinte:
Portanto, por exemplo, para a tabela de usuários, seria:
fonte
Para manter a ordem das linhas:
fonte
FYI: se você precisar especificar um novo valor inicial entre um intervalo de IDs (256 - 10000000, por exemplo):
fonte
Apenas redefinir a sequência e atualizar todas as linhas pode causar erros de identificação duplicados. Em muitos casos, você precisa atualizar todas as linhas duas vezes. Primeiro com IDs mais altos para evitar duplicatas, depois com os IDs que você realmente deseja.
Evite adicionar uma quantia fixa a todos os IDs (como recomendado em outros comentários). O que acontece se você tiver mais linhas que esse valor fixo? Supondo que o próximo valor da sequência seja maior que todos os IDs das linhas existentes (você só deseja preencher as lacunas), eu faria assim:
fonte
No meu caso, consegui isso com:
Onde minha tabela se chama table
fonte
Inspirado pelas outras respostas aqui, criei uma função SQL para fazer uma migração de sequência. A função move uma sequência de teclas primárias para uma nova sequência contígua iniciando com qualquer valor (> = 1) dentro ou fora do intervalo de sequências existente.
Explico aqui como usei essa função na migração de dois bancos de dados com o mesmo esquema, mas com valores diferentes em um banco de dados.
Primeiro, a função (que imprime os comandos SQL gerados para que fique claro o que realmente está acontecendo):
A função
migrate_pkey_sequence
aceita os seguintes argumentos:arg_table
: nome da tabela (por exemplo'example'
)arg_column
: nome da coluna da chave primária (por exemplo'id'
)arg_sequence
: nome da sequência (por exemplo'example_id_seq'
)arg_next_value
: próximo valor para a coluna após a migraçãoEle executa as seguintes operações:
nextval('example_id_seq')
seguemax(id)
e que a sequência começa com 1. Isso também lida com o caso em quearg_next_value > max(id)
.arg_next_value
. A ordem dos valores-chave é preservada, mas os furos no intervalo não são preservados.Para demonstrar, usamos uma sequência e uma tabela definidas da seguinte forma (por exemplo, usando
psql
):Em seguida, inserimos alguns valores (começando, por exemplo, em 3):
Por fim, migramos os
example.id
valores para começar com 1.O resultado:
fonte
Mesmo a coluna de incremento automático não é PK (neste exemplo, é chamada seq - também conhecida como sequência), você pode conseguir isso com um gatilho:
DROP TABLE SE EXISTE devops_guide CASCADE;
fonte
Se você estiver usando o pgAdmin3, expanda 'Sequências', clique com o botão direito do mouse em uma sequência, vá para 'Propriedades' e, na guia 'Definição', altere 'Valor atual' para o valor que desejar. Não há necessidade de uma consulta.
fonte