插入一条记录后想要立刻获取其数据表中的主键的值。这个主键是自增 1 的,我想到有两种办法: 再进行一次查询,获取出来。或者在插入数据之前取出最大值,在最大值上面加一  , 但这样不能解决并发性。当多人同一时间提交的时候就出问题了。哪个高手帮我谢谢SQL语句!!!

解决方案 »

  1.   

    你可以尝试先取nextval值,把nextval的值赋给一个变量id,然后再进行insert ..... values(变量id,xxx,xx,xx,xx)然后每次返回者个变量ID就是返回主键了
      

  2.   

    如果用的ibatis,类似于这样的语句就行了
    <selectKey resultClass="long" keyProperty="id">
    select last_insert_id()
    </selectKey>
    如果纯用jdbc,考虑到并发性的问题,建议写个存储过程,或者单独一张表维护sequence
      

  3.   

    符合 JDBC 3.0 规范的驱动都有个 RETURN_GENERATED_KEYS 的功能。下面这段代码是在另外一个帖子中回复的,人家比你好,还说了使用 Oracle,而你什么都没说。import java.sql.Connection;
    import java.sql.DatabaseMetaData;
    import java.sql.PreparedStatement;
    import java.sql.ResultSet;
    import java.sql.SQLException;
    import java.sql.Timestamp;public class OracleTest {    public static void main(String[] args) {
            Connection con = null;
            PreparedStatement ps = null;
            ResultSet rs = null;
            try {
                con = OracleConnectionFactory.getConnection();
                DatabaseMetaData dmd = con.getMetaData();
                
                System.out.println("database product name: " + dmd.getDatabaseProductName());
                System.out.println("database product version: " + dmd.getDatabaseProductVersion());
                System.out.println("supports generate keys? " + dmd.supportsGetGeneratedKeys());
                
                String sql = "INSERT INTO t_mt_stat (id, mt_time, stat, stat_time) " +
                        "VALUES (s_mt_stat.nextval, ?, ?, ?)";
                
                ps = con.prepareStatement(sql, new String[]{"ID"});  // 后面一个参数表示需要返回的列
                
                ps.setTimestamp(1, new Timestamp(System.currentTimeMillis()));
                ps.setString(2, "Y");
                ps.setTimestamp(3, new Timestamp(System.currentTimeMillis()));
                ps.executeUpdate();
                
                if(dmd.supportsGetGeneratedKeys()) {
                    rs = ps.getGeneratedKeys();
                    while(rs.next()) {
                        // 如果使用 rs.getInt("ID") 会报错,奇怪的 Oracle JDBC 驱动!
                        System.out.println("ID: " + rs.getInt(1));
                    }
                }
                
            } catch (SQLException e) {
                e.printStackTrace();
            } finally {
                JdbcUtil.close(rs, ps, con);
            }
        }
    }
      

  4.   

    这个系统不是自带有generator的功能吗?
      

  5.   

    ///执行更新或插入语句,并返回生成的编号---主键!!
    public int UpdateReturnID(String sqlStr)
    {
    int id=0;
    if(sqlStr==null||sqlStr.equals(""))
    {
    return 0;
    }
    try {
    this.getConnection();
    this.stmt =conn.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY);
    if(stmt.executeUpdate(sqlStr)>0){
    String sql="select @@IDENTITY as id";
    ResultSet rs=stmt.executeQuery(sql);
    if(rs.next()){
    id=rs.getInt("id");
    }
    }
    } catch (java.sql.SQLException e) {
    e.printStackTrace();
    return 0;
    }finally{
    try{
    if(this.stmt!=null)
    {
    this.stmt.close();
    }
    }catch(java.sql.SQLException e)
    {
    e.printStackTrace();
    }
    try{
    if(this.conn!=null)
    {
    this.conn.close();
    }
    }catch(java.sql.SQLException e)
    {
    e.printStackTrace();
    }
    }
    return id;
    }
      

  6.   

    插入数据后,按ID的降序查询下数据库,最后一条数据,就是你插入数据的ID
      

  7.   

    忘记说了,是MSSQL !!!大家帮下忙呀
      

  8.   

    这个确实不好弄,
    其实就是你自己的方法,
    先插入记录然后取最大的id号
    记住你的这段代码块必须加上同步哦
    代码块上加个synchronized
    这样会安全一点
      

  9.   

    6楼写的代码只是获取数据库的id值,当插入一条记录后,它并没有获取id的值呀。