如何在插入行之前在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
这里的一些解释会有所帮助。目前尚不清楚这是否应该是答案,新问题或评论。 –
OP想要一种方法来生成一个唯一的ID。我暗示内置的“newid()”在这里可能有些用处。所以,如果感兴趣,原始海报可以简单地在Sybase文档中查找这个内置文件,然后从这里继续:) –
我建议将这个解释添加到您的答案中。仅有代码的答案并不总是很清楚。 :) –