O que poderia causar ids duplicados em um campo de chave primária auto incremento (mysql)?

StackOverflow https://stackoverflow.com/questions/514018

  •  21-08-2019
  •  | 
  •  

Pergunta

RESOLVIDO

Do desenvolvedor: o problema era que uma versão anterior do código ainda estava escrevendo para a mesa que usou ids manual em vez da auto incremento. Nota to self:. Verificar sempre para outros locais possíveis onde a mesa está escrito para

Estamos recebendo chaves duplicadas em uma tabela. Eles não são inseridos ao mesmo tempo (6 horas de intervalo).

Estrutura da tabela:

CREATE TABLE `table_1` (
  `sales_id` int(10) unsigned NOT NULL auto_increment,
  `sales_revisions_id` int(10) unsigned NOT NULL default '0',
  `sales_name` varchar(50) default NULL,
  `recycle_id` int(10) unsigned default NULL,
  PRIMARY KEY  (`sales_id`),
  KEY `sales_revisions_id` (`sales_revisions_id`),
  KEY `sales_id` (`sales_id`),
  KEY `recycle_id` (`recycle_id`)
) ENGINE= MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=26759 ;

A inserção:

insert into `table_1` ( `sales_name` ) VALUES ( "Blah Blah" )

Estamos executando MySQL 5.0.20 com PHP5 e usar mysql_insert_id () para recuperar o ID de inserção imediatamente após a consulta de inserção.

Foi útil?

Solução

Eu tive alguns erro de chave duplicada aparecem de repente em bancos de dados MySQL no passado, mesmo que a chave primária é definida e auto_increment. Cada um e cada vez que tenha sido porque a tabela foi corrompido.

Se é corrupto realizando uma tabelas de seleção devem expor o problema. Você pode fazer isso executando:

CHECK TABLE tbl_name

Se ele volta como corrupto de qualquer maneira (geralmente dizem que o tamanho é maior do que realmente deve ser), então basta executar o seguinte para repará-lo:

REPAIR TABLE tbl_name

Outras dicas

O campo sales_id ter uma chave primária (ou único)? Se não, então alguma coisa está provavelmente fazendo inserções ou atualizações que é re-utilizando os números existentes. E por "algo mais" que eu faço código não apenas média; que poderia ser um ser humano com acesso ao banco de dados fazê-lo acidentalmente.

Como o outro disse; com o seu exemplo não é possível.

É alheios à sua pergunta, mas você não tem que fazer uma chave separada para a coluna de chave primária - é apenas a adição de um extra de índice não-exclusivo para a tabela quando você já tem a chave única (primário).

Estamos recebendo chaves duplicadas em uma tabela.

Você quer dizer que você está recebendo erros como você tenta inserir ou você quer dizer que você tenha alguns valores armazenados na coluna mais de uma vez?

Auto-incremento apenas em chutes quando você omitir a coluna de seu INSERT, ou tentar inserir NULL ou zero. Caso contrário, você pode especificar um valor em uma instrução INSERT, excesso de equitação o mecanismo de auto-incremento. Por exemplo:

INSERT INTO table_1 (sales_id) VALUES (26759);

Se o valor que já especificam existe na tabela, você obterá um erro.

Por favor, postar os resultados desta consulta:

SELECT `sales_id`, COUNT(*) AS `num`
FROM `table_1`
GROUP BY `sales_id`
HAVING `num` > 1
ORDER BY `num` DESC
  • Se você tem uma chave única em outros campos, que poderia ser o problema.

  • Se você tiver atingido o valor mais alto para o seu MySQL coluna auto_increment continuará tentando re-inseri-lo. Por exemplo, se sales_id era uma coluna tinyint, você iria receber erros de chave duplicados depois de atingido ID 127.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top