Составной автоинкрементный индекс в mysql

Я тут умища набрался, исходники почитав 😃 . Вот есть куча ньюсгрупп. В каждой свой индекс сообщений, который должен постоянно расти, причем без “дырок”

Если группа одна - все просто. Вешаем автоинкрементный индекс и не паримся. Если групп много - ну не хранить же каждую в отдельной таблице. Или если счетчики с номерами последних сообщений хранить отдельно - надо обеспечивать атомарность апдейтов. А это либо транзакции, либо херомантия с процедурами и триггерами. Бяка!

Оказалось, что давно есть относительно простое решение - можно автоинкрементный индекс навесить не на одну колонку, а сразу на две (id сообщения и id группы). Тогда все растет правильно. Почти. Нюанс в том, что если стереть последнее сообщение в группе, то новое будет добавлено с тем же id. Составной автоинкремент, в отличие от обычного, последний “использованный” ID для каждой группы (после удаления строки) хранить не умеет. То есть, пока ничего не удаляем - все хорошо. А если удаляем последнее сообщение в группе - нумерация слетает.

Выход оказался тривиальным - строки не удалять, а только помечать как удаленные. Вроде все пашет. И главное - простой код .

  • 1118