Последовательности Oracle - PullRequest
3 голосов
/ 10 мая 2009

Я использую Последовательность, чтобы сгенерировать для меня идентификатор, но я использую эту последовательность из моего Java-приложения. Например, мой последний идентификатор - 200.

Если я добавлю запись с .sql, используя 201 в качестве идентификатора вместо выполнения seq.nextval. Что произойдет, когда мое Java-приложение вызовет seq.nextval? Является ли последовательность достаточно умной, чтобы проверить максимально доступное число, или она просто вернет 201?

Ответы [ 5 ]

3 голосов
/ 10 мая 2009

Он просто вернет 201, поскольку последовательность не знает, для чего используются числа.

Примечание: он может вернуть, скажем, 220, если вы указали, что последовательность должна кэшировать значения для некоторого сеанса (см. Руководство Oracle о CREATE SEQUENCE для получения более подробной информации)

2 голосов
/ 10 мая 2009

Последовательности просто предоставляют способ «выбирать» числа, которые автоматически увеличиваются.

Вы получите 201, потому что они ничего не проверяют, они просто сохраняют последнее полученное значение, и когда вы запросите его снова, оно вернет следующее значение в последовательности.

0 голосов
/ 12 мая 2009

Никогда не стоит смешивать значения, генерируемые последовательностью, с ручными вставками, потому что тогда все смешивается.

Не уверен, поможет ли это в вашей ситуации, но помните, что вы можете запросить текущее значение последовательности (с seq.currval или аналогичным), чтобы вы могли проверить, существует ли уже в таблице из-за ручной вставки и при необходимости попросите еще один следующий

0 голосов
/ 10 мая 2009

То, что nextval возвращает при следующем вызове из вашего Java-приложения, зависит от ряда факторов:

  1. Если вы работаете в кластерной среде, к какому узлу вы будете обращаться в следующий раз. Каждый узел будет предварительно выделять пул значений последовательности;
  2. Был ли перезапущен узел, с которым вы разговариваете. Если это произойдет, пул значений последовательности будет «потерян» (то есть пропущен);
  3. значение шага последовательности; и
  4. Будут ли транзакции вызывать nextval в последовательности.

Последовательности свободно упорядочены, не упорядочены.

Но Oracle понятия не имеет, что вы делаете со значениями последовательности, поэтому, если вы вставите 201 в базу данных, последовательность с радостью вернет 201, совершенно не обращая внимания на вставленное значение, поскольку эти два в основном не связаны.

0 голосов
/ 10 мая 2009

Вернется 201.

Вы также можете использовать nextval из JDBC, а затем использовать это значение для вставки:

Statement st = conn.createStatement();
ResultSet rs = st.executeQuery("select seq.nextval from dual");
rs.next();
int yourId = rs.getInt(1);

// then use yourId to do the insert

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

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