sqlserver数据库pay0718,有两个表,一个为部门表,列名分别为部门号,部门名,另一个表为person表,列名为工号,姓名,性别,外键部门号,现在我已经用Java语言连接到了数据库,我写了一个类personselect,用来展示所有员工的信息,我还写了一个类personadd,用来添加员工信息,但是我遇到了一个问题,我添加同样的工号时,Java提示我违反了主键约束,我怎么在Java里优化我的添加功能,还有我添加不存在的部门号时,提醒我违反外键约束,我又应该怎么优化我的代码
时间: 2023-10-13 21:04:18 浏览: 59
查看SQLServer数据库每个表占用的空间大小.sql
在Java中,你可以使用try-catch语句来捕获违反主键约束或外键约束的异常,然后对这些异常进行处理。下面是一个示例代码,演示如何在Java中捕获并处理这些异常:
```java
public class PersonAdd {
// 添加员工信息
public void addPerson(Person person) {
String sql = "INSERT INTO person (工号, 姓名, 性别, 部门号) VALUES (?, ?, ?, ?)";
try {
PreparedStatement pstmt = connection.prepareStatement(sql);
pstmt.setInt(1, person.getId());
pstmt.setString(2, person.getName());
pstmt.setString(3, person.getGender());
pstmt.setInt(4, person.getDepartmentId());
pstmt.executeUpdate(); // 执行SQL语句
} catch (SQLException e) {
if (e.getErrorCode() == 2627) { // 违反主键约束
System.out.println("工号已存在,请重新输入。");
} else if (e.getErrorCode() == 547) { // 违反外键约束
System.out.println("部门号不存在,请重新输入。");
} else {
e.printStackTrace();
}
}
}
}
```
在上面的代码中,我们使用了PreparedStatement来执行SQL语句,并且使用了try-catch语句来捕获SQL异常。在catch块中,我们判断了异常的错误码,如果是2627,则说明违反了主键约束,如果是547,则说明违反了外键约束。根据不同的情况,我们可以打印相应的提示信息,或者进行其他的处理。
另外,为了避免违反外键约束,我们可以在添加员工信息之前,先检查部门号是否存在。下面是一个简单的部门号检查的示例代码:
```java
public class PersonAdd {
// 检查部门号是否存在
public boolean checkDepartment(int departmentId) {
String sql = "SELECT COUNT(*) FROM department WHERE 部门号 = ?";
try {
PreparedStatement pstmt = connection.prepareStatement(sql);
pstmt.setInt(1, departmentId);
ResultSet rs = pstmt.executeQuery(); // 执行SQL查询
if (rs.next() && rs.getInt(1) > 0) {
return true; // 部门号存在
} else {
return false; // 部门号不存在
}
} catch (SQLException e) {
e.printStackTrace();
return false;
}
}
// 添加员工信息
public void addPerson(Person person) {
if (!checkDepartment(person.getDepartmentId())) {
System.out.println("部门号不存在,请重新输入。");
return;
}
// ...
}
}
```
在上面的代码中,我们先编写了一个checkDepartment方法来检查部门号是否存在。如果存在,则返回true,否则返回false。在添加员工信息之前,我们先调用checkDepartment方法来检查部门号是否存在。如果不存在,则打印相应的提示信息,并且不执行后面的代码。这样就可以避免违反外键约束了。
阅读全文