无法从数据库中删除行
Can't delete row from a database
我在某个学校项目中工作,我的工作是在 Java FX 中为该列表视图制作一个删除按钮,但问题是当我想继续时,它会显示这个错误。我尝试了一些解决方案,但其中 none 有效。
所以这是代码
@FXML
private void removeStudentOnClick(ActionEvent event) throws IOException, SQLException{
ModelEditStudent student=(ModelEditStudent)tables.getSelectionModel().getSelectedItem();
String sql="DELETE FROM student WHERE nr_indeksu=?";
Alert alert = new Alert(Alert.AlertType.CONFIRMATION);
alert.setTitle("Usuwanie studenta");
alert.setHeaderText(null);
alert.setContentText("Czy na pewno chcesz usunąc tego studenta z listy?");
Optional <ButtonType> action = alert.showAndWait();
if(action.get() == ButtonType.OK){
tables.getItems().removeAll(tables.getSelectionModel().getSelectedItem());
try{
try (Connection myConn = ConnectionManager.getConnection()) {
try (PreparedStatement st = myConn.prepareStatement(sql)) {
st.setString(1, student.getNr_indeksu());
st.executeUpdate();
}
myConn.close();
}
}catch (SQLException e){
System.out.println(e);
}
}
出现错误:
com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationException:
Cannot delete or update a parent row: a foreign key constraint fails
(`wu`.`oceny`, CONSTRAINT `oceny_ibfk_3` FOREIGN KEY (`nr_indeksu`)
REFERENCES `student` (`nr_indeksu`))
此操作的所有要点都是关于选择行并在按下按钮后从数据库中删除。现在它只适用于列表视图,但不会从数据库中删除记录。
有人知道它是如何工作的吗?
您有一个名为 oceny
的 table,其中有一列 nr_indeksu
包含学生 ID。您已经在 table 上创建了一个外键约束,这要求这些学生 ID 与 student
table.
中的内容相匹配
如果您尝试删除 student
table 中被 oceny
table 引用的内容,您将收到此错误,否则,它将离开数据库处于 oceny
table 引用不存在的学生的状态。
对此有多种解决方案。您需要考虑在这种情况下实际应该发生什么 - 当您删除匹配的学生时,您希望 oceny
行发生什么。
您可以选择更改外键以使其执行 "cascade delete" - 也就是说,oceny
在与 student
相同的事务中自动删除. some information here 介绍了如何做到这一点。
我认为问题出在您的数据库架构中。尝试修复外键 dependencies.I 意味着 nr_indeksu 的值存在于您数据库的另一个 table 中。
我在某个学校项目中工作,我的工作是在 Java FX 中为该列表视图制作一个删除按钮,但问题是当我想继续时,它会显示这个错误。我尝试了一些解决方案,但其中 none 有效。
所以这是代码
@FXML
private void removeStudentOnClick(ActionEvent event) throws IOException, SQLException{
ModelEditStudent student=(ModelEditStudent)tables.getSelectionModel().getSelectedItem();
String sql="DELETE FROM student WHERE nr_indeksu=?";
Alert alert = new Alert(Alert.AlertType.CONFIRMATION);
alert.setTitle("Usuwanie studenta");
alert.setHeaderText(null);
alert.setContentText("Czy na pewno chcesz usunąc tego studenta z listy?");
Optional <ButtonType> action = alert.showAndWait();
if(action.get() == ButtonType.OK){
tables.getItems().removeAll(tables.getSelectionModel().getSelectedItem());
try{
try (Connection myConn = ConnectionManager.getConnection()) {
try (PreparedStatement st = myConn.prepareStatement(sql)) {
st.setString(1, student.getNr_indeksu());
st.executeUpdate();
}
myConn.close();
}
}catch (SQLException e){
System.out.println(e);
}
}
出现错误:
com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationException:
Cannot delete or update a parent row: a foreign key constraint fails
(`wu`.`oceny`, CONSTRAINT `oceny_ibfk_3` FOREIGN KEY (`nr_indeksu`)
REFERENCES `student` (`nr_indeksu`))
此操作的所有要点都是关于选择行并在按下按钮后从数据库中删除。现在它只适用于列表视图,但不会从数据库中删除记录。
有人知道它是如何工作的吗?
您有一个名为 oceny
的 table,其中有一列 nr_indeksu
包含学生 ID。您已经在 table 上创建了一个外键约束,这要求这些学生 ID 与 student
table.
如果您尝试删除 student
table 中被 oceny
table 引用的内容,您将收到此错误,否则,它将离开数据库处于 oceny
table 引用不存在的学生的状态。
对此有多种解决方案。您需要考虑在这种情况下实际应该发生什么 - 当您删除匹配的学生时,您希望 oceny
行发生什么。
您可以选择更改外键以使其执行 "cascade delete" - 也就是说,oceny
在与 student
相同的事务中自动删除. some information here 介绍了如何做到这一点。
我认为问题出在您的数据库架构中。尝试修复外键 dependencies.I 意味着 nr_indeksu 的值存在于您数据库的另一个 table 中。