Mysql
 sql >> Datenbank >  >> RDS >> Mysql

zyklisches Autoinkrement für jeden Schlüsselwert

MyISAM unterstützt dieses Verhalten. Erstellen Sie einen zweispaltigen Primärschlüssel und machen Sie den zweiten Spalte Autoinkrement. Es beginnt für jeden einzelnen Wert in der ersten Spalte von vorne.

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 |
+---+---+

Aber wenn Sie darüber nachdenken, ist dies nur in einer Speicher-Engine Thread-sicher, die Sperren auf Tabellenebene durchführt für INSERT-Anweisungen. Weil INSERT andere Zeilen in der Tabelle durchsuchen muss, um den maximalen j zu finden Wert für denselben i Wert. Wenn andere Personen gleichzeitig INSERTs ausführen, entsteht eine Race-Condition.

Daher die Abhängigkeit von MyISAM, das Sperren auf Tabellenebene bei INSERT durchführt.

Siehe diese Referenz im Handbuch:http:// dev.mysql.com/doc/refman/5.6/en/example-auto-increment.html im Abschnitt MyISAM-Notizen .

Es gibt viele gute Gründe, MyISAM nicht zu verwenden. Ausschlaggebend für mich ist die Tendenz von MyISAM, Daten zu korrumpieren.

Zu Ihrem Kommentar:

InnoDB unterstützt das oben beschriebene Inkrement-pro-Gruppen-Verhalten nicht. Sie können einen mehrspaltigen Primärschlüssel erstellen, aber der Fehler, den Sie erhalten haben, liegt daran, dass InnoDB erfordert, dass die Auto-Increment-Spalte die erste Spalte in einem Schlüssel der Tabelle ist (es muss nicht unbedingt der Primärschlüssel sein)

Unabhängig von der Position der Auto-Increment-Spalte im mehrspaltigen Schlüssel wird sie nur erhöht, wenn Sie sie mit InnoDB verwenden. es nummeriert Einträge nicht pro eindeutigem Wert in einer anderen Spalte.

Um dies mit einer InnoDB-Tabelle zu tun, müssten Sie die Tabelle explizit für die Dauer des INSERT sperren, um Racebedingungen zu vermeiden. Sie würden Ihre eigene SELECT-Abfrage für den maximalen Wert in der Gruppe durchführen, in die Sie einfügen. Dann fügen Sie diesen Wert + 1 ein.

Grundsätzlich müssen Sie die Autoinkrement-Funktion umgehen und Werte angeben, anstatt sie automatisch generieren zu lassen.