MyISAM поддържа това поведение. Създайте първичен ключ с две колони и направете втори автоматично увеличаване на колоната. Ще започне отначало за всяка отделна стойност в първата колона.
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 |
+---+---+
Но ако се замислите, това е безопасно за нишки само в машина за съхранение, която прави заключване на ниво таблица за оператори INSERT. Тъй като INSERT трябва да търси в други редове в таблицата, за да намери максималния j
стойност за същия i
стойност. Ако други хора извършват INSERT едновременно, това създава състояние на състезание.
По този начин, зависимостта от MyISAM, която прави заключване на ниво таблица на INSERT.
Вижте тази препратка в ръководството:http:// dev.mysql.com/doc/refman/5.6/en/example-auto-increment.html под раздела Бележки на MyISAM .
Има много основателни причини да не използвате MyISAM. Решаващият фактор за мен е склонността на MyISAM да поврежда данни.
Re your comment:
InnoDB не поддържа описаното по-горе поведение на нарастване на група. Можете да направите първичен ключ с много колони, но грешката, която получавате, е, защото InnoDB изисква колоната за автоматично нарастване да бъде първата колона в ключ на таблицата (не е задължително да е първичен ключ)
Независимо от позицията на колоната за автоматично нарастване в ключа с няколко колони, тя се увеличава само когато я използвате с InnoDB; не номерира записи за отделна стойност в друга колона.
За да направите това с InnoDB таблица, ще трябва да заключите таблицата изрично за продължителността на INSERT, за да избегнете условия на състезание. Бихте направили своя собствена заявка SELECT за максималната стойност в групата, в която вмъквате. След това въведете тази стойност + 1.
По принцип трябва да заобиколите функцията за автоматично нарастване и да посочите стойности, вместо да ги генерирате автоматично.