Heim >Datenbank >MySQL-Tutorial >Detaillierte Einführung in die automatische Erhöhung des Feldwerts von MySQL (mit Code)
Dieser Artikel bietet Ihnen eine detaillierte Einführung in den MySQL-Feldwert (mit Code). Ich hoffe, er wird Ihnen als Referenz dienen.
1 Vorwort
Dieser Artikel stammt aus der Beantwortung einer Frage eines Internetnutzers auf Sifou. Dieser Internetnutzer hat eine neue Tabelle erstellt, in der auto_increment_increment auf 10 und der Startwert der AUTO_INCREMENT-Primärtabelle festgelegt ist Schlüssel auf 9 gesetzt. Als er die Daten einfügte, stellte er fest, dass der Primärschlüsselwert bei 11 begann, also war er verwirrt. In diesem Artikel wird das Problem der automatischen Inkrementierung von Feldern erläutert.
2 Berechnungsmethode für das Auto-Inkrement-Feld
Der Wert des Auto-Inkrement-Felds hängt mit dem Parameter auto_increment_increment und dem Parameter auto_increment_offset zusammen -Inkrement-Feld-Offset-Wert, auch Es dient zur Berechnung des Startwerts. Der Parameter auto_increment_increment legt die Schrittgröße des Auto-Inkrement-Felds fest, dh um wie viel es sich jedes Mal erhöht. auto_inkrement_inkrement und auto_inkrement_offset werden häufig bei der Master-Master-Replikation verwendet, um eine Duplizierung von Primärschlüsseln zu verhindern. auto_increment_increment ist ein Integer-Typ mit einem Wert von 1-65535. Wenn er auf 0 gesetzt ist, wird er auf 1 geändert. Wenn die Einstellung den Wertebereich überschreitet, wird er auf 65535 geändert.
Der Wert des Felds „Auto-Inkrement“ wird durch die Formel „Auto_Inkrement_Offset + N × Auto-Inkrement_Inkrement“ berechnet, und N ist eine ansteigende Sequenz ähnlich [1,2,3,...]. Beim Einfügen eines Datenelements übernimmt die Datenbank das kleinste Element, das größer oder gleich dem aktuellen AUTO_INCREMENT ist, aus der durch auto_increment_offset + N × auto_increment_increment berechneten Inkrementierungssequenz als nächsten automatischen Inkrementierungswert des Felds.
Auto_Inkrement_Inkrement kann dynamisch geändert werden, aber bei der Berechnung des Werts des Auto-Inkrement-Felds wird dieser nicht von den vorhandenen Daten beeinflusst und die Berechnungsmethode bleibt unverändert.
Machen wir ein paar Tests
db83-3306>>SET @@auto_increment_increment=10; Query OK, 0 rows affected (0.00 sec) db83-3306>>SHOW VARIABLES LIKE 'auto_inc%'; +--------------------------+-------+ | Variable_name | Value | +--------------------------+-------+ | auto_increment_increment | 10 | | auto_increment_offset | 1 | +--------------------------+-------+ 2 rows in set (0.00 sec) db83-3306>>CREATE TABLE autoinc1( -> id INT NOT NULL AUTO_INCREMENT PRIMARY KEY -> ) engine=InnoDB; Query OK, 0 rows affected (0.01 sec) db83-3306>>INSERT INTO autoinc1 VALUES (NULL), (NULL), (NULL), (NULL); Query OK, 4 rows affected (0.00 sec) Records: 4 Duplicates: 0 Warnings: 0 db83-3306>>select * from autoinc1; +----+ | id | +----+ | 1 | | 11 | | 21 | | 31 | +----+ 4 rows in set (0.00 sec)
Wir haben zuerst eine Tabelle mit automatisch inkrementierenden Feldern erstellt, die Schrittgröße auf 10 gesetzt, die Daten eingefügt und festgestellt, dass das Wachstum tatsächlich dem im berechneten Wert entspricht Formel. Als nächstes testen wir, ob das Festlegen von AUTO_INCREMENT beim Erstellen einer Tabelle irgendwelche Auswirkungen hat
db83-3306>>CREATE TABLE autoinc2( -> id INT NOT NULL AUTO_INCREMENT PRIMARY KEY -> ) engine=InnoDB AUTO_INCREMENT=8; Query OK, 0 rows affected (0.01 sec) db83-3306>>INSERT INTO autoinc2 VALUES (NULL), (NULL), (NULL), (NULL); Query OK, 4 rows affected (0.00 sec) Records: 4 Duplicates: 0 Warnings: 0 db83-3306>>select * from autoinc2; +----+ | id | +----+ | 11 | | 21 | | 31 | | 41 | +----+ 4 rows in set (0.00 sec)
Sie können sehen, dass selbst wenn der Wert von AUTO_INCREMENT festgelegt ist, dies keinen Einfluss auf die Berechnung von Feldern mit automatischer Inkrementierung hat
3 Andere Situationen
Das Obige ist der Wert unter normalen Umständen. Nachfolgend besprechen wir einen Sonderfall
3.1 Automatische Erhöhung basierend auf der Gruppierung
Es gibt einen Sonderfall, der dazu führt, dass das automatisch inkrementierende Feld möglicherweise nicht automatisch inkrementiert wird. Das heißt, wenn die MyISAM-Engine und ein gemeinsamer Index verwendet werden, ist das automatisch inkrementierende Feld das erste Feld des nicht-gemeinsamen Index.
In diesem Fall ist der Wert des Auto-Inkrement-Felds MAX(auto_increment_column) + auto_increment_offset WHERE prefix=given-prefix. Wie man es versteht, ist, dass bei der Berechnung des Wachstumswerts ein Feld davor erstellt wird das gemeinsame Index-Auto-Inkrement-Feld Gruppe und führen Sie eine unabhängige Wachstumsberechnung innerhalb der Gruppe durch.
Wenn Sie beispielsweise einen gemeinsamen Index für a, b und c erstellen und c ein automatisch inkrementierendes Feld ist, führen Sie eine unabhängige Wachstumsberechnung für die Daten unter der Bedingung durch, dass a = xx und b =xx. Das Folgende ist ein Beispiel:
db83-3306>>CREATE TABLE user_pets ( -> name varchar(16) NOT NULL, -> id_inc INT NOT NULL AUTO_INCREMENT, -> pets varchar(16) NOT NULL, -> PRIMARY KEY (name, id_inc) -> ) ENGINE=MyISAM; Query OK, 0 rows affected (0.00 sec) db83-3306>>INSERT INTO user_pets(name, pets) VALUES -> ('chengqm', 'dog'), -> ('chengqm', 'cat'), -> ('chengqm', 'fish'), -> ('yexm', 'dog'), -> ('yexm', 'cat'), -> ('yexm', 'fish'); Query OK, 6 rows affected (0.00 sec) Records: 6 Duplicates: 0 Warnings: 0 db83-3306>>SELECT * FROM user_pets; +---------+--------+------+ | name | id_inc | pets | +---------+--------+------+ | chengqm | 1 | dog | | chengqm | 11 | cat | | chengqm | 21 | fish | | yexm | 1 | dog | | yexm | 11 | cat | | yexm | 21 | fish | +---------+--------+------+ 6 rows in set (0.00 sec)
Wie aus den Ergebnissen hervorgeht, werden in Feldern mit demselben name
-Feld unabhängige Selbsterhöhungsberechnungen durchgeführt, wenn . group by
Das obige ist der detaillierte Inhalt vonDetaillierte Einführung in die automatische Erhöhung des Feldwerts von MySQL (mit Code). Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!