Je sais que MySQL limite les colonnes auto_increment aux clés primaires. Pourquoi est-ce? Ma première pensée est que c'est une restriction de performances, car il y a probablement une table de compteur quelque part qui doit être verrouillée pour obtenir cette valeur.
Pourquoi ne puis-je pas avoir plusieurs colonnes auto_increment dans la même table?
Merci.
mysql
primary-key
auto-increment
Christopher Armstrong
la source
la source
Réponses:
Pourquoi voudriez-vous avoir une colonne auto_increment qui n'est pas la clé primaire?
Si vous voulez qu'une colonne soit un incrément automatique, par définition, vous ne stockez pas de données significatives dans cette colonne. Le seul cas où le stockage d'informations non significatives est logique est le cas spécial où vous souhaitez avoir une clé primaire synthétique. Dans ce cas, le manque d'informations est un avantage car il n'y a aucun risque que quelqu'un vienne un jour dans le futur et veuille changer les données car un attribut d'une entité a changé.
Avoir plusieurs colonnes auto_increment dans la même table semble encore plus étrange. Les deux colonnes auraient les mêmes données - elles sont générées par le même algorithme et remplies en même temps après tout. Je suppose que vous pourriez trouver une implémentation où il est possible qu'ils soient légèrement désynchronisés s'il y avait suffisamment de sessions simultanées. Mais je ne peux pas imaginer comment cela pourrait être utile dans une application.
la source
En fait, l'attribut AUTO_INCREMENT n'est pas limité à la PRIMARY KEY (plus). Il en était ainsi dans les anciennes versions - certainement 3.23 et probablement 4.0. Toujours le manuel MySQL pour toutes les versions depuis 4.1 se lit comme ceci
Vous pouvez donc en effet avoir une colonne AUTO_INCREMENT dans une table qui n'est pas la clé primaire. Si cela a du sens, c'est un sujet différent.
Je dois également mentionner qu'une colonne AUTO_INCREMENT doit toujours être de type entier (techniquement, un type à virgule flottante est également autorisé) et qu'elle doit être UNSIGNED. Un type SIGNÉ ne gaspille pas seulement la moitié de l'espace clé, il peut également entraîner d'énormes problèmes si une valeur négative est insérée par accident.
Enfin, MySQL 4.1 et versions ultérieures définissent un alias de type SERIAL pour BIGINT UNSIGNED NOT NULL AUTO_INCREMENT UNIQUE.
la source
C'est une question intéressante car différentes bases de données ont des approches uniques pour fournir auto_increment.
MySQL : une seule clé auto_increment est générée pour identifier de manière unique une ligne dans une table. Il n'y a pas beaucoup d'explications derrière pourquoi, mais juste la mise en œuvre. Selon le type de données, les valeurs auto_increment sont fixées par la longueur du type de données en octets:
PostgreSQL
La série de type de données interne est utilisée pour l'incrémentation automatique de 1 à 2 147 483 647. De plus grandes plages sont autorisées en utilisant bigserial.
Oracle : l'objet de schéma appelé SEQUENCE peut créer de nouveaux nombres en invoquant simplement la fonction nextval. PostgreSQL dispose également d'un tel mécanisme.
Voici une belle URL qui indique comment les autres bases de données les spécifient: http://www.w3schools.com/sql/sql_autoincrement.asp
Maintenant, concernant votre question, si vous voulez vraiment avoir plusieurs colonnes auto_increment dans une seule table, vous devrez émuler cela.
Deux raisons pour lesquelles vous devez émuler ceci:
Comment l'imiteriez-vous ???
Utiliser plusieurs tables qui n'ont qu'une seule colonne auto_increment et les mapper aux colonnes souhaitées dans les tables cibles. Voici un exemple:
Copiez et collez cet exemple:
Cela créera un tableau de quiz pop pour les enseignants. J'ai également créé cinq émulateurs de séquence, un pour chaque jour de la semaine scolaire. Chaque émulateur de séquence fonctionne en insérant la valeur 0 dans la colonne val. Si l'émulateur de séquence est vide, il commence par la valeur 0, nextval 1. Sinon, la colonne nextval est incrémentée. Vous pouvez ensuite extraire la colonne nextval de l'émulateur de séquence.
Voici les exemples de résultats de l'exemple:
Si vous avez vraiment besoin de plusieurs valeurs d'incrémentation automatique dans MySQL, c'est le moyen le plus proche de l'émuler.
Essaie !!!
MISE À JOUR 2011-06-23 21:05
Je viens de remarquer dans mon exemple que je n'utilise pas la valeur @pop.
Cette fois, j'ai remplacé «pop_tue = pop_tue + 1» par «pop_tue = @pop» et réessayé l'exemple:
la source
bigserial
type de données qui offre une plage beaucoup plus large queComme le dit XL, il ne se limite pas aux seules clés primaires. Il est possible que vous ne puissiez avoir qu'une seule colonne de ce type par table, mais la meilleure solution consiste à générer autant de nombres dont vous avez besoin dans une autre table, puis à les insérer où vous le souhaitez.
la source