2016-11-03 1 views
1

У меня есть распределенная система, где мне нужно сгенерировать идентификатор, а затем использовать этот идентификатор в нескольких записях. Записи ссылаются друг на друга, поэтому я предпочитаю не вставлять мастера для генерации идентификатора, за которым следуют дети.Как я могу сгенерировать идентификатор в 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(); 

Есть ли более простой способ

ответ

-3
1> select newid(),newid(1) 
2> go 

------------------------------------ ------------------------------------ 
086ae8a4920944dcb45f81b8c983b3f1  3c23dabf-d989-48dc-807b-81b8c983b3f1 
+3

Некоторое объяснение здесь было бы полезно. Неясно, будет ли это ответ, новый вопрос или комментарий. –

+0

OP хотел, чтобы создать уникальный идентификатор. Я предполагаю, что встроенный «newid()» может быть использован здесь. Итак, если интересно, исходный плакат может просто найти это встроенное в документах Sybase и перейти оттуда :) –

+1

Я бы предложил добавить это объяснение к вашему ответу. Кодовые ответы не всегда ясны. :) –