Страницы

Поиск по вопросам

понедельник, 1 апреля 2019 г.

Как запретить AUTO_INCREMENT при неудачной вставке

При вставке очередной записи в таблицу, по определенным причинам она может не вставиться (например на колонке стоит ограничение уникальности и данный запрос его нарушает) но тем не менее колонка id в которой установлено свойство AUTO_INCREMENT увеличивается. Можно ли как-то это поведения изменить?


Ответ

Не стоит использовать значения, сгенерированные механизмом AUTO_INCREMENT, для создания неразрывных последовательностей. Его основная задача - создания уникальных значений. Разрывы в последовательностях сгенерированных чисел является штатной ситуацией. Более того, она необходима для целостности базы данных.
Например, если у вас есть таблица статей с AUTO_INCREMENT-идентификаторами. Такой идентификатор часто используется в ссылке на статью. Если вы удалите статью, произойдет разрыв последовательности. Заполнять эту последовательность нельзя ни в коем случае, даже если вы убрали все ссылки на нее в пределах базы данных, на старую статью могут быт ссылки из сети Интернет. Поэтому старые статьи будут вести на страницу с новым текстом, что приведет к нарушению целостности данных.
Этот пример не совсем в контексте вашего вопроса, однако, создавая механизмы обхода разрывов в AUTO_INCREMENT, вы двигаетесь в сторону нарушения целостности данных. В большой системе отслеживать ошибки будет очень трудно. Для надежности будущей системы, лучше принять AUTO_INCREMENT как есть: разрыв - значит разрыв. Если система вырастет до больших объемов поддерживать ее будет проще и дешевле.
Если же вам требуется неразрывная нумерация статей, лучше для этого предусмотреть отдельное поле, не завязанное на механизм AUTO_INCREMENT - у него другие задачи.

Комментариев нет:

Отправить комментарий