Когда вы используете MySQL и можете жить с таблицей с движком MyISAM, есть встроенная функциональность:
Для таблиц MyISAM вы можете указать AUTO_INCREMENT на вторичном
столбец в индексе из нескольких столбцов. В этом случае сгенерированное значение
для столбца AUTO_INCREMENT рассчитывается как
MAX (auto_increment_column) + 1 префикс WHERE = данный префикс. Это
полезно, когда вы хотите поместить данные в упорядоченные группы.
CREATE TABLE animals (
grp ENUM('fish','mammal','bird') NOT NULL,
id MEDIUMINT NOT NULL AUTO_INCREMENT,
name CHAR(30) NOT NULL,
PRIMARY KEY (grp,id)
) ENGINE=MyISAM;
INSERT INTO animals (grp,name) VALUES
('mammal','dog'),('mammal','cat'),
('bird','penguin'),('fish','lax'),('mammal','whale'),
('bird','ostrich');
SELECT * FROM animals ORDER BY grp,id;
Что возвращает:
+--------+----+---------+
| grp | id | name |
+--------+----+---------+
| fish | 1 | lax |
| mammal | 1 | dog |
| mammal | 2 | cat |
| mammal | 3 | whale |
| bird | 1 | penguin |
| bird | 2 | ostrich |
+--------+----+---------+
В этом случае (когда столбец AUTO_INCREMENT является частью
индекс нескольких столбцов), значения AUTO_INCREMENT используются повторно при удалении
строка с наибольшим значением AUTO_INCREMENT в любой группе. это
происходит даже для таблиц MyISAM, для которых значения AUTO_INCREMENT
обычно не используются повторно.