2016-11-03 91 views
1

我有一個分佈式系統,我需要生成一個ID然後在多個記錄中使用該ID。記錄互相引用,所以我寧願不插入主機以生成ID,然後是子級如何在插入行之前在Sybase SQL中生成ID

我希望能做的是從Sybase中按順序生成一個唯一的ID,使用該ID創建所有關聯的記錄,然後在批量更新中執行所有插入。

我可以有一個IDENTITY字段的表,只需要在那裏插入記錄並獲取生成的ID。然而,用這種方法,我創造了大量無用的記錄。

我試過這種方法,但它拋出一個異常

@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想要一種方法來生成一個唯一的ID。我暗示內置的「newid()」在這裏可能有些用處。所以,如果感興趣,原始海報可以簡單地在Sybase文檔中查找這個內置文件,然後從這裏繼續:) –

+1

我建議將這個解釋添加到您的答案中。僅有代碼的答案並不總是很清楚。 :) –

相關問題