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.