Последовательности Oracle

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

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

5 ответов

Решение

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

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

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

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

Это вернется 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

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

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

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

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

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

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

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

Другие вопросы по тегам