Как лучше формировать уникальный номер в БД, помимо автоинкрементного ключа?
Вы же в курсе что уникальный индекс можно повесить на набор полей, а не на одно поле? Держите все эти поля в разных столбцах таблицы, а для контроля целостности объединяете их в один уникальный индекс.
Сделайте контракт отдельной сущностью и храните в отдельной таблице. В один прекрасный день у вас неизбежно появятся студенты с несколькими контрактами.

Для выбора уникального номера зафиксируйте полный префикс и ищите максимальный номер с этим префиксом
contract_number like '111090621%'