student表:
id name classId
1 Jack 1
2 Lily 1
3 Mike 2
4 Aom 3
class表:
id className
1 一班
2 二班
现在想要为student表添加外键约束,也就是说classsId是class表的id
但在添加外键约束的时候,因为student表中有classId为3,class表中没有这个数据,会出现1452错误
现在想要用java写一个工具当出现这种情况的时候就把这一条没用的数据删掉,用代码怎样实现呢?
就是用java代码实现这句话就行了 : 当出现这种情况的时候就把这一条没用的数据删掉
我不知道怎样开头写。
按照楼主的意思是,将classID作为主键,studentID作为外键,首先这种约束应该是在数据库建立的时候定义的,如果在代码层,如果插入一条class表没有的记录时会报错的。
此时,如果想在代码层给表添加代码约束,如果没有对应记录是不行的,所以就只有正常的在catch异常部分进行删除多余数据,删除方法就是普通的数据库访问操作。
delete from student where classid not in (select id from class)
DELETE FROM STUDENT T WHERE T.CLASSID NOT IN (SELECT ID FROM CLASS),可以把这个语句放在你插入语句之前,而且尽量放在一个事务里边。首先删除没有对应的classid,然后再进行插入,这样的话就可以避免找不到外键而报错。
/**
* 根据id查询班级信息
* @param id
* @return
*/
public Class classTable(Integer id){
String sql = "select id,className from class where id=?";
Connection con = null;
PreparedStatement ps = null;
ResultSet rs = null;
con = DaoTool.getCon(); //自己从连接池获取连接
Class classInfo = new Class();
try {
ps = con.prepareStatement(sql);
ps.setInt(1, id);
rs = ps.executeQuery();
if (rs.next()) {
Class.setId(rs.getInt("id"));
Class.setClassName(rs.getString("className"));
}
} catch (SQLException e) {
e.printStackTrace();
} finally {
DaoTool.closeAll(con, ps, rs);
}
return classInfo;
}
/**
* 根据classId删除学生信息
* @param idclassId
*/
public void delStudent(Integer classId){
String sql = "delete from student where classId=?";
Connection con = null;
PreparedStatement ps = null;
con = DaoTool.getCon(); //自己从连接池获取连接
try {
con.setAutoCommit(false); //关闭自动事务
ps = con.prepareStatement(sql);
ps.setInt(1, classId);
ps.executeUpdate();
con.commit(); //事务提交
} catch (SQLException e) {
e.printStackTrace();
try {
con.rollback(); //事务回滚
} catch (SQLException e1) {
e1.printStackTrace();
}
} finally {
DaoTool.closeAll(con, ps, rs);
}
}
public static void main(String[] args) {
Integer id=3;
if(类名/对象名.classTable(id)==null){
类名/对象名.delStudent(3);
}
}