#oracle #sequence #cycle
#Oracle #последовательность #цикл
Вопрос:
Я попытался найти несколько реальных вариантов использования последовательностей в циклическом режиме.
мы можем использовать use sequence для генерации уникальных идентификаторов для первичных ключей, но это не обязательно, потому что мы также можем использовать IDENTITY .
можете ли вы дать мне несколько хороших практических сценариев для использования последовательности ЦИКЛОВ, увеличивающейся на 1, а затем на большее число, например 10 или 100?
Спасибо
Комментарии:
1. @Littlefoot все это хорошо объяснил, но я бы добавил, что столбцы идентификаторов все еще используют последовательность. Просто она создается и используется «за кулисами».
Ответ №1:
Как вы сказали, мы обычно используем последовательности для генерации уникальных значений — хороший выбор для первичных ключей. Поскольку первичные ключи не могут быть продублированы, нет особого смысла циклировать последовательность.
(Что касается столбцов идентификаторов: да, это опция в последних версиях базы данных Oracle, но они не существовали до 12c, поэтому мы использовали и до сих пор используем последовательности в более низких версиях).
Лично я никогда не использовал MAXVALUE
; большинство моих последовательностей просты, с использованием параметров по умолчанию, таких как
create sequence seq;
Однако, если вы установите MAXVALUE
и не обращаете внимания на количество значений, которые вы используете из него, как только вы достигнете максимума, вы получите
ORA-08004: sequence SEQ.NEXTVAL exceeds MAXVALUE and cannot be instantiated
Одно из решений этой проблемы — удалить maxvalue
(или установить для нее более высокое значение); другое — использовать CYCLE
так, чтобы — как только вы достигнете максимума — последовательность продолжала работать. Тем не менее, вы должны использовать CACHE
параметр вместе с ним (и его значение должно быть меньше одного цикла):
SQL> create sequence seq maxvalue 3 cycle;
create sequence seq maxvalue 3 cycle
*
ERROR at line 1:
ORA-04013: number to CACHE must be less than one cycle
Цикл равен «3», поэтому вы не можете установить CACHE
значение выше этого. Это работает:
SQL> create sequence seq maxvalue 3 cycle cache 2;
Sequence created.
Когда это использовать?
В случаях, когда ее значение является частью составного первичного ключа, где второй (фактически, другой) столбец (столбцы) гарантирует, что циклические значения последовательности не будут нарушать первичный ключ.
Другой вариант — промежуточная таблица; например, вы ежедневно получаете до 1 миллиона строк, представляющих платежи. Если для первичного ключа установлено значение number(6)
, вы не можете разрешить неограниченную последовательность (без maxvalue
), потому что вы не сможете вставить значение выше 999,999 в этот столбец. Но, если вы используете CYCLE
параметр, все будет работать нормально — дубликатов не будет, и значения будут соответствовать столбцу.