小弟在事务中提交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就会报错请问如何解决
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就会报错请问如何解决
解决方案 »
- 关于myeclipse8.5使用jsp:include提示错误
- Tomcat 6.0 两个数据源, hibernate配置JNDI问题。
- 关于RMI的问题,作业,急求问题原因
- 在Hibernate下用SchemaExport自动生成数据表出错:java.lang.NullPointerException,为什么???
- 过滤器Filter与response.getOutputStream()是否有冲突?
- 哪位高人在JB2005下配好过Tomcat5.5.4
- 高分求学习java的书籍和方法以及资料,up有分
- 急问:jbuilderx enterprise的序列是多少及hotkey???
- 使用ant编译ejb时,发现错误在使用了assert(断言)后出错!
- 用jbuilder怎样把htc文件打包到web application中去?
- 关于数据库连接池的讨论帖
- webservice中转问题
使用 PreparedStatement.getGeneratedKeys() 方法,
返回的结果集,只有一条记录,记录只有一个字段,就是上述插入表A记录的自增主键的值。当然,还可以尝试使用数据库系统提供的全局变量。
select @@IDENTITY
返回的就是最近一次向具有identity属性(即自增列)的表插入数据时对应的自增列的值。
具体来看,楼主可以试试下面的语句,当然,我没试过不保证一定正确。
insert into a(a_name) value(1,a);
insert into b(b_name,a_id) value(b,@@identity);
http://dev.mysql.com/doc/refman/5.1/zh/connectors.html#cj-retrieve-autoinc
我曾经也用SELECT LAST_INSERT_ID()的方法检索过自动生成的ID,但是好像不能保证每次都能检索正确,有可能会得到0,不知道你有没有遇到过这种情况??
比如 你第一次 insert id=1
这时候你就查询 select id from table where name = ?
这时候返回的id 就是你插入的id 而这时候事务没有提交的时候如果出现插入第二个表的异常回滚的时候
当你第二次执行 insert的时候 id = 2
id = 1的那条记录就回滚了 也不会再分配id =1的id了,所以这保证了数据的一致性!~经过测试。