MyISAM suporta esse comportamento. Crie uma chave primária de duas colunas e torne a segunda incremento automático da coluna. Ele começará de novo para cada valor distinto na primeira coluna.
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 |
+---+---+
Mas se você pensar bem, isso é apenas thread-safe em um mecanismo de armazenamento que faz bloqueio em nível de tabela para instruções INSERT. Porque o INSERT tem que pesquisar outras linhas na tabela para encontrar o máximo
j
valor pelo mesmo i
valor. Se outras pessoas estiverem fazendo INSERTs simultaneamente, isso cria uma condição de corrida. Assim, a dependência do MyISAM, que faz o bloqueio em nível de tabela em INSERT.
Veja esta referência no manual:http:// dev.mysql.com/doc/refman/5.6/en/example-auto-increment.html na seção, Notas do MyISAM .
Há muitas boas razões para não usar o MyISAM. O fator decisivo para mim é a tendência do MyISAM de corromper os dados.
Re seu comentário:
O InnoDB não suporta o comportamento de incremento por grupo descrito acima. Você pode criar uma chave primária de várias colunas, mas o erro que você obteve é porque o InnoDB exige que a coluna de incremento automático seja a primeira coluna em uma chave da tabela (não precisa ser estritamente a chave primária)
Independentemente da posição da coluna de incremento automático na chave de várias colunas, ela só é incrementada quando você a usa com o InnoDB; ele não numera entradas por valor distinto em outra coluna.
Para fazer isso com uma tabela InnoDB, você teria que bloquear a tabela explicitamente durante o INSERT, para evitar condições de corrida. Você faria sua própria consulta SELECT para o valor máximo no grupo ao qual está inserindo. Em seguida, insira esse valor + 1.
Basicamente, você precisa ignorar o recurso de incremento automático e especificar valores em vez de tê-los gerados automaticamente.