Как повторно сгенерировать удаленные порядковые номера в спящем режиме? - PullRequest
1 голос
/ 10 июля 2020

Как мы знаем, приведенная ниже аннотация спящего режима генерирует новый номер каждый раз из последовательности, начиная с 1. Рассмотрим ситуацию, когда у меня есть набор записей с идентификаторами (1-5). Теперь из таблицы удаляется запись, которая имел идентификатор 3. Если мы видим, что номер 3 отсутствует в последовательности 1-5 из-за операции. У меня есть требование, чтобы последовательность повторно сгенерировала и переназначила этот номер 3, когда я буду добавлять новую запись в таблицу. Как это сделать?

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private int id;

Ответы [ 2 ]

5 голосов
/ 10 июля 2020

Не думаю, что это отличная идея. Последовательность - это просто число, каждый раз увеличивающееся на 1. Это позволяет работать быстро, но уже сейчас это узкое место для распределенной базы данных для записи, поскольку все узлы должны синхронизироваться по этому номеру.

Если вы попытаетесь получить первое доступное целое число, вам в основном нужно сделать полное сканирование таблицы, упорядочить записи по идентификатору и проверить первую отсутствующую. Это чрезвычайно дорого и бессмысленно для чего-то, что должно быть как можно более дешевым.

Вы должны рассматривать идентификатор как технический идентификатор без функционального значения и, следовательно, не заботиться о том, есть ли дыры в последовательности или нет.

3 голосов
/ 10 июля 2020

Я согласен с Николасом, но для пояснения.

Вы используете «Идентификатор», а не «Последовательность», между ними есть некоторые различия, а также способы их объявления и использования (каждая база данных может иметь их пропиетарная реализация).

Последовательность - это независимый объект в вашей базе данных с некоторыми свойствами (например, начало, конец, приращение, ...), а идентификатор - это «свойство» столбца, которое зависит от того, как база данных обрабатывает это.

В случае последовательности (и в зависимости от базы данных в некоторых идентификаторах) вы можете создать последовательности «cycli c», чтобы повторять числа после завершения цикла. Но никогда последовательность или идентичность не сканируют «пробелы» в идентификаторах. (Как сказал Николас, это действительно плохо для производительности)

Но в зависимости от того, как ваш код будет работать, вы можете создать цикл в последовательности, чтобы предотвратить постоянное увеличение значения. Но только вы уверены, что конфликтов при вставке новых записей не будет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...