我用的是Sybase数据库,id不是自动增长的
要插入数据的表是多人操作的,我插入数据时id选的就是select max(id),那再查的时候肯定就不能用这个了,因为很有可能把别人的id查出来
有没有什么好的方法?请高手写明白些,具体怎么实现。因为我的水平有限,写的简单的话我可能看不懂,谢谢了! 

解决方案 »

  1.   

    若是使用的Hibernate框架,就比较好做了。
      

  2.   

    Hibernate框架插入后,所的对象中就有自动增长的ID,你可以看下Hibernate源代码是怎么做的
      

  3.   

    看下这个例子,在mysql5环境下,测试通过的.
    表:
    DROP TABLE IF EXISTS `user`;
    CREATE TABLE `user` (
      `Id` int(11) NOT NULL auto_increment,
      `userName` varchar(255) default NULL,
      `userPwd` varchar(255) default NULL,
      `mail` varchar(250) default NULL,
      `address` varchar(255) default NULL,
      PRIMARY KEY  (`Id`)
    ) ENGINE=InnoDB DEFAULT CHARSET=gbk;java代码:
    PreparedStatement pres = conn
    .prepareStatement("insert into user(userName,userPwd) values('abc','a')");
    boolean form = pres.execute();
    ResultSet rs = pres.getGeneratedKeys();

    while (rs.next()) {
    System.out.println("---" +rs.getInt(1));
    }
      

  4.   

    先用select max(id) mixId把mixId查出来
    把mixId放到变量里
    再插入数据 ,这样插入的mixId就保存下来了
    String sql = "select mix(id) mixId";
    ..........
    int mixId = rs.get("mixId");
    sql = insert into table (id,..) values(mixId,..);不知道我理解的对不对
      

  5.   

    取最后一条数据的ID,也可以把数据按ID逆序排列,取第一条。
      

  6.   

    大哥们,都不行啊
    我的表id不是自动增长的,getGeneratedKeys()方法不行;
    先把最大id查出来,如果这时有人插入记录,我再插入记录时用刚才我查出来那个id不就不对了吗;
    取最后一条id就更不对了,我刚插入完一条记录别人马上就插入了一条,我再取最后一条id肯定不是我的还有没有肯定能用的法啊?有效点的!!!
      

  7.   

    根据你插入数据的条件查询啊,或者用hibernate啊。
      

  8.   

    Emerson_Li ,说明白点,怎么写sql
    现在不用hibernate,我得和项目统一
    我插入的数据和其他数据也可能重复,这怎么查啊
      

  9.   

    用 hibernate 返回一个对象
      

  10.   

    我现在的项目里不能用hibernate
      

  11.   

    LS的可以.在你查出最大ID的同时解锁..
      

  12.   

    那锁怎么加啊?把sql给我,还有解锁的
      

  13.   

    http://hi.baidu.com/xbzhu/blog/item/16aaff50ef7d8b541038c2e9.html
    用锁要小心。一个不小心就死锁了
      

  14.   

    一、通过排序取插入前最大ID  然后加一就是刚插入的ID二、从数据库的临时表(inserted和deleted)中按照一定的查询条件可以查到新增ID
      

  15.   

    sql="insert into XX values(); select @@identity";
    stmt.execute("");
    stmt.getMoreResults();
    ResultSet rs = stmt.getResultSet();
    rs.getInt(1);
      

  16.   

    sql="insert into XX values(); select @@identity";
    stmt.execute("");
    stmt.getMoreResults();
    ResultSet rs = stmt.getResultSet();
    rs.getInt(1);
      

  17.   

    HIBERNATE 或者JPA都有方法可以解决
    HIBERNATE 的save方法 会返回一个Serializable类型字段 就是你所插入的对象的ID。
    JPA更方便 你调用persist方法后,他自动会帮你把持久化的对象返回,所以那个保存的实体就是带ID的了。
      

  18.   

    增加一个专门记录ID的表
    至少 3 个字段:对应表名(唯一约束)、当前ID、说明在新增时,根据表名,得到 当前ID,读取完成后 当前ID 增加 1这样就能保证这个 ID 不会重复
      

  19.   

    你的ID不是自动增长的 ,那是不是在插入之前就知道ID是多少呢 ?
      

  20.   

    用oracle的话,好像可以在insert 语句后加returning 返回你刚插那条记录的ID吧.
      

  21.   

    如果符合 JDBC 3.0 规范的 JDBC 驱动程序,可以使用 Statement.RETURN_GENERATED_KEYS 这个参数。在 Connection 中有个 prepareStatement(String sql, int autoGeneratedKeys) 这个方法。
      

  22.   

    bao110908 说的确实没错,表照这么设计还真TMD的没事给自己找事!