2009-02-05 4 views
0

RESOLUQu'est-ce qui pourrait causer des identifiants dupliqués sur un champ de clé primaire d'incrémentation automatique (mysql)?

par le développeur: le problème est qu'une version antérieure du code écrivait encore à la table qui a utilisé ids manuelle au lieu de l'incrément automatique. Note to self: vérifiez toujours les autres emplacements possibles où la table est écrite.

Nous obtenons des clés en double dans une table. Ils ne sont pas insérés en même temps (à 6 heures d'intervalle).

Tableau structure:

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 ; 

L'insert:

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

Nous courons MySQL 5.0.20 avec PHP5 et en utilisant mysql_insert_id() pour récupérer l'ID d'insertion immédiatement après la requête d'insertion.

+0

S'il vous plaît fournir le résultat de SHOW CREATE TABLE, ce serait utile. –

Répondre

5

J'ai eu quelques erreurs de clé en double apparaissent soudainement dans les bases de données MySql dans le passé même si la clé primaire est définie et auto_increment. Chaque fois que c'est parce que la table est corrompue.

S'il est corrompu, une vérification des tables devrait exposer le problème.Vous pouvez le faire en exécutant:

CHECK TABLE tbl_name 

Si elle revient aussi corrompu de toute façon (dira généralement la taille est plus grande qu'elle ne devrait en fait être) puis exécutez simplement ce qui suit pour le réparer:

REPAIR TABLE tbl_name 
2

Le champ sales_id a-t-il une clé primaire (ou unique)? Sinon, alors quelque chose d'autre est probablement en train de faire des insertions ou des mises à jour qui réutilisent des nombres existants. Et par "quelque chose d'autre", je ne veux pas dire simplement du code; ce pourrait être un humain ayant accès à la base de données le faisant accidentellement.

+0

Désolé, oui, sales_id possède une clé primaire. J'ai oublié de mentionner cela. Bonne capture bien que +1 –

0
  • Si vous avez une clé unique sur d'autres champs, cela pourrait poser problème.

  • Si vous avez atteint la valeur la plus élevée pour votre colonne auto_increment, MySQL continuera à essayer de le réinsérer. Par exemple, si sales_id était une colonne tinyint, vous obtenez des erreurs clés en double après avoir atteint id 127.

+0

non et non :( –

+0

pas vrai du tout, mysql génère une erreur si cela se produit – Zbynek

2

Comme dit l'autre; avec votre exemple, ce n'est pas possible. Ce n'est pas lié à votre question, mais vous n'avez pas besoin de créer une clé distincte pour la colonne de la clé primaire - il suffit d'ajouter un index supplémentaire non unique à la table lorsque vous avez déjà la clé unique (principale) .

+0

Thxs pour le remarquer Je vais le mentionner au développeur. –

2

Nous obtenons des clés en double dans un tableau.

Voulez-vous dire que vous obtenez des erreurs lorsque vous essayez d'insérer, ou voulez-vous dire que vous avez des valeurs stockées dans la colonne plus d'une fois?

L'auto-incrémentation ne se déclenche que lorsque vous omettez la colonne de votre INSERT, ou essayez d'insérer NULL ou zéro. Sinon, vous pouvez spécifier une valeur dans une instruction INSERT, en ignorant le mécanisme d'incrémentation automatique. Par exemple:

INSERT INTO table_1 (sales_id) VALUES (26759); 

Si la valeur que vous spécifiez existe déjà dans la table, vous obtiendrez une erreur.

1

S'il vous plaît afficher les résultats de cette requête:

SELECT `sales_id`, COUNT(*) AS `num` 
FROM `table_1` 
GROUP BY `sales_id` 
HAVING `num` > 1 
ORDER BY `num` DESC 
Questions connexes