如何在插入行之前在Sybase SQL中生成ID

如何在插入行之前在Sybase SQL中生成ID

问题描述:

我有一个分布式系统,我需要生成一个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(); 

有没有更简单的方式

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

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

这里的一些解释会有所帮助。目前尚不清楚这是否应该是答案,新问题或评论。 –

+0

OP想要一种方法来生成一个唯一的ID。我暗示内置的“newid()”在这里可能有些用处。所以,如果感兴趣,原始海报可以简单地在Sybase文档中查找这个内置文件,然后从这里继续:) –

+1

我建议将这个解释添加到您的答案中。仅有代码的答案并不总是很清楚。 :) –