Mysql
 sql >> Base de données >  >> RDS >> Mysql

auto-incrémentation cyclique pour chaque valeur de clé

MyISAM prend en charge ce comportement. Créez une clé primaire à deux colonnes et créez la seconde auto-incrémentation de la colonne. Il recommencera pour chaque valeur distincte dans la première colonne.

CREATE TABLE t (i INT, j INT AUTO_INCREMENT, PRIMARY KEY (i,j)) ENGINE=MyISAM;
INSERT INTO t (i) VALUES (1), (1), (2), (2), (1), (3);
SELECT * FROM t; 

+---+---+
| i | j |
+---+---+
| 1 | 1 |
| 1 | 2 |
| 1 | 3 |
| 2 | 1 |
| 2 | 2 |
| 3 | 1 |
+---+---+

Mais si vous y réfléchissez, ce n'est que thread-safe dans un moteur de stockage qui effectue un verrouillage au niveau de la table pour les instructions INSERT. Parce que l'INSERT doit rechercher d'autres lignes dans la table pour trouver le max j valeur par le même i évaluer. Si d'autres personnes effectuent des INSERTS simultanément, cela crée une condition de concurrence.

Ainsi, la dépendance à MyISAM, qui effectue un verrouillage au niveau de la table sur INSERT.

Voir cette référence dans le manuel :http:// dev.mysql.com/doc/refman/5.6/en/example-auto-increment.html sous la section, MyISAM Notes .

Il existe de nombreuses bonnes raisons de ne pas utiliser MyISAM. Le facteur décisif pour moi est la tendance de MyISAM à corrompre les données.

Concernant votre commentaire :

InnoDB ne prend pas en charge le comportement d'incrémentation par groupe décrit ci-dessus. Vous pouvez créer une clé primaire multi-colonnes, mais l'erreur que vous avez est due au fait qu'InnoDB exige que la colonne d'auto-incrémentation soit la première colonne d'une clé de la table (elle ne doit pas strictement être la clé primaire)

Quelle que soit la position de la colonne d'auto-incrémentation dans la clé multi-colonnes, elle ne s'incrémente que lorsque vous l'utilisez avec InnoDB ; il ne numérote pas les entrées par valeur distincte dans une autre colonne.

Pour ce faire avec une table InnoDB, vous devez verrouiller explicitement la table pendant la durée de l'INSERT, pour éviter les conditions de concurrence. Vous feriez votre propre requête SELECT pour la valeur maximale dans le groupe dans lequel vous insérez. Insérez ensuite cette valeur + 1.

Fondamentalement, vous devez contourner la fonction d'auto-incrémentation et spécifier des valeurs au lieu de les générer automatiquement.