小弟在事务中提交insert语句 如下
A ---- B 是一对多关系表A
a_id
a_name表B
b_id
b_name
a_id
现在要同时添加两条记录
insert into a(a_name) value(1,a);/
insert into b(b_name,a.id) value(b,插入a后返回的a的id)
现在问题是 在事务中 执行插入a之后 其实没有在数据库给他生成一个id(id使用的是mysql自增id字段) 所以 我要想查出a的id就会报错请问如何解决

解决方案 »

  1.   

    id还是在插入之前自己赋值吧,用UID生成唯一主键,或者放在两个事务中
      

  2.   

    如果使用JDBC的话,可以在执行向第一个SQL语句后,
    使用  PreparedStatement.getGeneratedKeys() 方法,
    返回的结果集,只有一条记录,记录只有一个字段,就是上述插入表A记录的自增主键的值。当然,还可以尝试使用数据库系统提供的全局变量。
    select @@IDENTITY
    返回的就是最近一次向具有identity属性(即自增列)的表插入数据时对应的自增列的值。
    具体来看,楼主可以试试下面的语句,当然,我没试过不保证一定正确。
    insert into a(a_name) value(1,a);
    insert into b(b_name,a_id) value(b,@@identity);
      

  3.   

    需要使用 JDBC 3.0 规范的 getGeneratedKeys 方法参考 MySQL 的文档26.3.1.4. 检索AUTO_INCREMENT列的值
    http://dev.mysql.com/doc/refman/5.1/zh/connectors.html#cj-retrieve-autoinc
      

  4.   


    我曾经也用SELECT LAST_INSERT_ID()的方法检索过自动生成的ID,但是好像不能保证每次都能检索正确,有可能会得到0,不知道你有没有遇到过这种情况??
      

  5.   

    谢谢各位的回答,我把问题解决了 因为mysql在分配自增id的同时 只要插入它就分配,不管你是提交了还是未提交
    比如 你第一次 insert  id=1
    这时候你就查询 select id from table where name = ?
    这时候返回的id  就是你插入的id  而这时候事务没有提交的时候如果出现插入第二个表的异常回滚的时候
    当你第二次执行 insert的时候 id = 2 
    id = 1的那条记录就回滚了 也不会再分配id =1的id了,所以这保证了数据的一致性!~经过测试。