2016-11-03 8 views
1

IDを生成し、そのIDを複数のレコードで使用する分散システムがあります。レコードはお互いを参照するので、IDを生成するためにマスターを挿入しないでください。行を挿入する前にSybase SQLでIDを生成するには

私は、Sybaseから順番に一意のIDを生成し、そのIDを使用して関連するすべてのレコードを作成しますバッチ更新ですべての挿入を実行します。

1つのIDENTITYフィールドを持つテーブルを作成し、そこにレコードを挿入して生成されたIDを取得することができます。しかし、そのアプローチでは、無駄なレコードをたくさん作成しています。

私はこのアプローチを試みたが、それは私もこれを試してみましたが、またSQLの例外が発生しました例外

@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; 
} 

をスロー:

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

私はあなたの答えにその説明を追加することをお勧めします。コードのみの回答は必ずしも明確ではありません。 :) –

関連する問題