Para minha grande (e preocupante) surpresa, acabei de perceber que minha tabela com milhões de linhas, tem um punhado de linhas, onde a chave primária (ID) é uma duplicata! Não entendo como isso pode acontecer e como posso evitar isso no futuro?
A coluna que contém a chave primária está, e sempre esteve, sujeita a umaCONSTRAINT fruits_pkey PRIMARY KEY(id);
Estou executando o postgreql 9.3.4 no ubuntu.
ATUALIZAR
@Mat: o tipo de dados éinteger
@ypercube: Sim, select count(*) from (select count(*) from fruits group by id having count(*) > 1) as t1
retorna 41
.
@Craig: Sim, já fiz um failover antes e meu escravo é, na verdade, 9.3.3
Tudo foi causado pelo bug descrito e corrigido nesta versão: http://www.postgresql.org/about/news/1506/
Isso nos causou muitos problemas!
Há um utilitário gratuito aqui para corrigir chaves duplicadas que violam as restrições PRIMARY KEY ou UNIQUE no PostgreSQL como resultado do bug nº 11141. Ele funciona removendo duplicatas que não são acessíveis do índice de restrição.
Eu tive um problema semelhante agora. Linhas duplicadas apesar de um índice PK. Também não consegui reconstruir o índice devido a isso.
Corrigi-o fazendo uma seleção de grupo com count(*) sobre as colunas de chave primária com uma instrução where que forçava uma verificação sequencial da tabela.
Isso me deu todas as duplicatas e eu poderia excluí-las para finalmente reindexar a chave primária. Espero que isso nunca mais aconteça.