假设我有三个表:team,player,team_player。表team_player是一个桥接表,允许“多对多”关系。
当某人想要创建一个新团队时,他们指定该团队的初始球员。
如何在同一交易中同时插入team和team_player行?也就是说,我想在提交到新团队行之前插入所有team_player记录。我正在使用JDBC和Oracle。
当我尝试下面的代码时,即使team.id是一个数字(由触发器递增),teamId也会由字母字符串填充。因此,这似乎不是我刚刚尝试插入的记录的ID(但尚未提交)。
c = DB.getConnection(); c.setAutoCommit(false); sql = "INSERT INTO team (name) values (?)"; myInsert = c.prepareStatement(sql, Statement.RETURN_GENERATED_KEYS); myInsert.setString(1, "cougars"); int affectedRows = memoInsert.executeUpdate(); String teamId; ResultSet generatedKeys = myInsert.getGeneratedKeys(); if (generatedKeys.next()) { teamId = generatedKeys.getString(1); } // ...loop through players inserting each player and team.id into team_player // c.commit();
在这里,我读到了有关RETURN_GENERATED_KEYS的信息: 如何在JDBC中获取插入ID?
Oracle JDBC驱动程序不支持getGeneratedKeys()-您正在触发器中手动生成密钥,大概是从中生成的SEQUENCE。
getGeneratedKeys()
SEQUENCE
您可以使用Oracle的returning子句:
String query = "BEGIN INSERT INTO team (name) values (?) returning id into ?; END;"; CallableStatement cs = conn.prepareCall(query); cs.setString(1, "cougars"); cs.registerOutParameter(2, OracleTypes.NUMBER); cs.execute(); System.out.println(cs.getInt(2));
或使用第二个SQL查询获取最后一个序列号:
SELECT mysequence.CURRVAL FROM dual