Trop d'auto incrémente avec SUR le DOUBLE de la CLÉ de mise à JOUR
J'ai une table de base avec des colonnes:
- id (primaire avec IA)
- nom (unique)
- etc
Si la colonne unique n'existe pas, INSÉREZ la ligne, sinon mettre à JOUR la ligne....
INSERT INTO pages (name, etc)
VALUES
'bob',
'randomness'
ON DUPLICATE KEY UPDATE
name = VALUES(name),
etc = VALUES(etc)
Le problème est que si on effectue une mise à JOUR, la valeur auto_increment sur la colonne id de la monte. Donc, si tout un tas de MISES à jour sont effectuées, l'id auto_increment passe par le toit.
Apparemment c'était un bug: http://bugs.mysql.com/bug.php?id=28781
...mais je suis en utilisant InnoDB de mySQL 5.5.8 sur l'hébergement mutualisé.
D'autres personnes d'avoir des problèmes avec pas de solution il y a des années:
prévenir autoincrement sur MYSQL en double insert et
Pourquoi MySQL autoincrement augmentation sur l'échec des inserts?
Idées sur un correctif? Ai-je peut-être structurés de la base de données de manière incorrecte en quelque sorte?
******EDIT****: Il apparaît que l'ajout de innodb_autoinc_lock_mode = 0 pour votre mon.fichier ini résout le problème mais quelles sont les options que j'ai pour l'hébergement mutualisé?
******EDIT 2******: OK, je pense que ma seule option est de changer de MyISAM que le moteur de stockage. Être un méga mySQL débutant, j'espère que ne pas causer de nombreux problèmes. Ouais?
- Un gros problème avec MyISAM est qu'il ne prend pas en charge la définition de la base de données de relations. InnoDB ne soutien.
- innodb_autoinc_lock_mode = 0 a fonctionné pour moi. merci
- Je suis passé à Aria (MyISAM dans MariaDB), qui empêche l'auto_increment
innodb_autoinc_lock_mode = 0
est de ralentir concurenteINSERT
parce que l'utilisation de la table de verrouillage automatique inc champ. C'est peut être mauvais.
Vous devez vous connecter pour publier un commentaire.
Je ne pense pas qu'il existe un moyen de contourner ce comportement de
INSERT ... ON DUPLICTE KEY UPDATE
.Vous pouvez cependant mettre deux états, l'un
UPDATE
et unINSERT
, dans un transaction:INSERT IGNORE INTO pages (name, etc) SELECT 'bob' AS name , 'randomness' AS etc FROM dual
ON DUPLICATE KEY UPDATE
.Le double de la clé fonctionnalités de MySQL est exactement le même que le fait de faire deux requêtes distinctes, l'une pour le sélectionner, puis on soit à mettre à jour l'enregistrement sélectionné, ou l'insertion d'un nouvel enregistrement. Le faire par programmation est tout aussi rapide et permet d'éviter ce problème à l'avenir ainsi que de rendre votre code plus portable.