У меня есть распределенная система, где мне нужно сгенерировать идентификатор, а затем использовать этот идентификатор в нескольких записях. Записи ссылаются друг на друга, поэтому я предпочитаю не вставлять мастера для генерации идентификатора, за которым следуют дети.Как я могу сгенерировать идентификатор в Sybase SQL перед вставкой строк
То, что я надеюсь сделать, это сгенерировать уникальный идентификатор в последовательности из Sybase, использовать этот идентификатор для создания всех связанных записей , затем выполните все вставки в пакетном обновлении.
Я могу иметь таблицу с одним полем IDENTITY и просто вставлять туда записи и получать сгенерированный идентификатор. Однако при таком подходе я создаю много бесполезных записей.
Я попробовал этот подход, но он бросает исключение
@Transactional(isolation = Isolation.SERIALIZABLE)
public synchronized Long getNextId(){
Long id = -1;
String sql = "UPDATE MY_IDS SET MY_ID=MY_ID+1\n\n" +
"SELECT MY_ID FROM MY_IDS";
List<Long> list = jdbcTemplate.query(sql, new RowMapper<Long>() {
@Override
public Long mapRow(ResultSet resultSet, int i) throws SQLException
{
return resultSet.getLong(1);
}
});
if(!list.isEmpty()) {
id = list.get(0);
}
return id;
}
Я также попытался это, но и получил исключение SQL:
KeyHolder holder = new GeneratedKeyHolder();
jdbcTemplate.update(new PreparedStatementCreator() {
String sql = "UPDATE MY_IDS SET MY_ID=MY_ID+1" +
"SELECT MY_ID FROM MY_IDS";
@Override
public PreparedStatement createPreparedStatement(Connection connection)
throws SQLException {
PreparedStatement ps = connection.prepareStatement(sql, Statement.RETURN_GENERATED_KEYS);
return ps;
}
}, holder);
Long id = holder.getKey().longValue();
Есть ли более простой способ
Некоторое объяснение здесь было бы полезно. Неясно, будет ли это ответ, новый вопрос или комментарий. –
OP хотел, чтобы создать уникальный идентификатор. Я предполагаю, что встроенный «newid()» может быть использован здесь. Итак, если интересно, исходный плакат может просто найти это встроенное в документах Sybase и перейти оттуда :) –
Я бы предложил добавить это объяснение к вашему ответу. Кодовые ответы не всегда ясны. :) –