一个Connection带2个PreparedStatement的顺序问题
程序员文章站
2022-03-03 23:52:43
...
遇到这么个问题,2个表:TB_PARENT(COL_ID,COL_NAME,COL_ADDRESS)
TB_USER(COL_ID,COL_USERNAME,parentID)
TB_USER的 parentID 外键 到 TB_PARENT的COL_ID(主键)
先上代码:
Connection conn = ConnectionPool.getConnection();// 获得数据库连接
try {
conn.setAutoCommit(false);
} catch (SQLException e2) {
e2.printStackTrace();
}
String sql="INSERT INTO TB_PARENT(COL_ID,COL_NAME,COL_ADDRESS) VALUES(?,?,?)";
String sql2="INSERT INTO TB_USER(COL_ID,COL_USERNAME,parentID) VALUES(?,?,?)";
PreparedStatement psmt=null,psmt2=null;
try {
psmt=conn.prepareStatement(sql);
psmt.setInt(1, 201);
psmt.setString(2, "parent1");
psmt.setString(3, "shanghai");
psmt.execute();
psmt2=conn.prepareStatement(sql2);
psmt2.setInt(1, 200);
psmt2.setString(2, "nihao");
psmt2.setInt(3, 201);
psmt2.execute();
conn.commit();
} catch (SQLException e) {
try {
conn.rollback();
} catch (SQLException e1) {
e1.printStackTrace();
}
e.printStackTrace();
} finally{
try {
psmt.close();
psmt2.close();
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
会报出 java.sql.SQLException: ORA-02291: 违反完整约束条件 (USERNAME.FK_T) - 未找到父项关键字
(USERNAME.FK_T)是这个外键名字
但是,我把 psmt 和 psmt2的执行的位置颠倒下 就可以插入了 没有任何报错
代码如下:
Connection conn = ConnectionPool.getConnection();// 获得数据库连接
try {
conn.setAutoCommit(false);
} catch (SQLException e2) {
e2.printStackTrace();
}
String sql="INSERT INTO TB_PARENT(COL_ID,COL_NAME,COL_ADDRESS) VALUES(?,?,?)";
String sql2="INSERT INTO TB_USER(COL_ID,COL_USERNAME,parentID) VALUES(?,?,?)";
PreparedStatement psmt=null,psmt2=null;
try {
psmt2=conn.prepareStatement(sql2);
psmt2.setInt(1, 200);
psmt2.setString(2, "nihao");
psmt2.setInt(3, 201);
psmt2.execute();
psmt=conn.prepareStatement(sql);
psmt.setInt(1, 201);
psmt.setString(2, "parent1");
psmt.setString(3, "shanghai");
psmt.execute();
conn.commit();
} catch (SQLException e) {
try {
conn.rollback();
} catch (SQLException e1) {
e1.printStackTrace();
}
e.printStackTrace();
} finally{
try {
psmt.close();
psmt2.close();
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
想不通啊 为什么? 难道在一个connection 提交前越晚执行的语句越早被提交吗?一般不是先插入被外键关联的数据,再插入本数据么
后来我把那个constraint取消掉,2段代码 都不报错了 ,很想知道原因 能人来解答下吧
上一篇: JavaScript——数据类型
下一篇: plsq程序设计--存储过程