Я пытаюсь создать последовательность в Snowflake для идентификатора таблицы, мне нужно, чтобы она увеличивалась 1 на 1 (1,2,3,4,...), однако, когда я ее создаю и пытаюсь sequence.nextval, она увеличивается (1,101,201,301 ...) и я не знаю почему.
Я использую следующий код для создания последовательности (я использую системного администратора и правильную базу данных)
CREATE OR REPLACE SEQUENCE SEQ_AUTHOR_UID
START WITH 1
INCREMENT BY 1;
COMMENT= 'Use this to fill in AUTHOR_UID';
Также я попробовал:
CREATE SEQUENCE SEQ_AUTHOR_UID
START = 1
INCREMENT = 1
COMMENT = 'Use this to fill in AUTHOR_UID';
Как говорит @NickW, это не проблема. Он работает так, как задумано. Я бы предположил, что это результат того, что документацию не читают, и она выглядит... странно. Потому что так оно и есть, пока вы не поймете почему. В списке есть ответы, объясняющие это. Выберите один из них или уточните, в чем проблема. Это работает так, как задумано.





Согласно NickW, указывающему на документы:
Важный
Snowflake не гарантирует создание порядковых номеров без пробелов. Сгенерированные числа не обязательно являются смежными.
Гарантируется, что последовательность будет больше, чем предыдущее полученное значение. Это называется Монотонной функцией, которая сохраняет порядок.
Это означает, что вы можете сказать, что если последовательность <, она появилась раньше, и, следовательно, также, если > она пришла после рассматриваемой строки. Чтобы иметь числа без пробелов, вам нужно будет использовать ROW_NUMBER() over (ORDER BY sequence_id).
Проблема в том, что вам приходится делать это при чтении каждый раз.
Вы можете использовать UPDATE, чтобы записать всю таблицу со стабильными числами, но возникает проблема: если какая-либо строка будет удалена, теперь у вас есть пробелы. Возможно, именно поэтому вам нужны числа без пробелов, но в этом случае имеет смысл использовать Stream для мониторинга таблицы. ИЛИ, если вам нужно обнаружение пробелов с более длительным сроком службы, используйте вторичную таблицу со вставкой по логике INSERT или DELETE, в зависимости от баланса работы по записи/чтению, которую вы ожидаете для таблицы.
Это необходимо пометить как правильный ответ, в документации в Snowflake четко указано, что это работает так, как задумано.
Когда вы создаете новую последовательность или новый столбец с автоматическим приращением, вы можете указать параметр ORDER или NOORDER, чтобы указать, может ли последовательность генерировать новые значения в порядке возрастания.
ORDER указывает, что значения, сгенерированные для последовательности или столбца с автоматическим приращением, расположены в порядке возрастания (или, если интервал имеет отрицательное значение, в порядке убывания).
Например, если столбец последовательности или столбец с автоматическим приращением имеет START 1 INCREMENT 2, сгенерированные значения могут быть 1, 3, 5, 7, 9 и т. д.
NOORDER указывает, что значения не обязательно будут находиться в возрастающем порядке.
Например, если последовательность имеет START 1 INCREMENT 2, сгенерированные значения могут быть 1, 3, 101, 5, 103 и т. д.
NOORDER может повысить производительность, когда необходимо одновременно выполнить несколько операций вставки (например, когда несколько клиентов выполняют несколько операторов INSERT).
По умолчанию: параметр NOORDER_SEQUENCE_AS_DEFAULT определяет, какое свойство установлено по умолчанию.
Для получения дополнительной информации ознакомьтесь с приведенной ниже документацией:
https://docs.snowflake.com/en/release-notes/bcr-bundles/2024_01/bcr-1483
https://docs.snowflake.com/en/sql-reference/sql/create-sequence#optional-parameters
https://docs.snowflake.com/en/sql-reference/parameters#noorder-sequence-as-default
Чтобы получить порядок последовательности, используйте параметр order.
CREATE OR REPLACE SEQUENCE SEQ_AUTHOR_UID
START WITH 1
INCREMENT BY 1
order;
select SEQ_AUTHOR_UID.nextval;
Привет @sasank_sharma! Я не думаю, что твой ответ касается проблемы, связанной с тем, что последовательность не генерирует смежные числа, о чем и идет вопрос, поэтому я не уверен, что это на самом деле ответ. Однако не стесняйтесь объяснить, как он решает этот вопрос, если хотите.
Пожалуйста, прочитайте изменение поведения ниже: docs.snowflake.com/en/release-notes/bcr-bundles/2024_01/… У нас должна быть возможность воспроизвести вопрос клиента. Чтобы получить порядок последовательности, используйте параметр order. СОЗДАТЬ ИЛИ ЗАМЕНИТЬ ПОСЛЕДОВАТЕЛЬНОСТЬ SEQ_AUTHOR_UID НАЧНИТЕ С 1 ПРИРАЩЕНИЯ НА 1 порядок; выберите SEQ_AUTHOR_UID.nextval;
Я не верю, что это влияет на фундаментальный способ генерации последовательностей Snowflake, но рад, что оказался неправ. Вверху этой страницы docs.snowflake.com/en/user-guide/querying-sequences, а также на странице СОЗДАНИЕ ПОСЛЕДОВАТЕЛЬНОСТЕЙ указано, что «Snowflake не гарантирует создание порядковых номеров без пробелов. Сгенерированные числа не являются обязательно смежные.». Насколько я понимаю, вопрос заключается в том, что им нужны смежные числа, а с последовательностями это невозможно.
Привет! Это подробно описано в документации здесь: docs.snowflake.com/en/user-guide/querying-sequences. Можете ли вы уточнить, зачем вам нужны смежные числа?