java将数据插入包含外键的mysql表时出错
我的数据库中有两个表:
员工详细信息表:
- 员工id int主键
- 员工姓名varchar(20)
员工考勤:
- 员工id外键引用的员工id 员工详细信息表
- 出席人数(日期)
- 存在或不存在varchar(6)
以下是将数据插入员工考勤的java代码:
class Attendance
{
java.util.Date utilDate;
java.sql.Date sqlDate;
String attDate;
int empid;
String pa;
Connection con=null;
PreparedStatement statement=null;
ResultSet rs=null;
private void jButton1ActionPerformed(java.awt.event.ActionEvent evt)
{
try
{
empid=Integer.parseInt(jTextField1.getText());
sqlDate=new java.sql.Date(utilDate.getTime());
pa=jComboBox1.getSelectedItem().toString();
}
catch(Exception e)
{
JOptionPane.showMessageDialog(null,e.getMessage());
}
String query = "Insert into employee_attendance (employee_id,attendance_for,present_or_absent) values (?,?,?)";
try
{
Class.forName("com.mysql.jdbc.Driver");
con=DriverManager.getConnection("jdbc:mysql:///hrmps?zeroDateTimeBehavior=convertToNull","root","root");
statement=con.prepareStatement(query);
statement.setInt(1,empid);
//sqlDate=new java.sql.Date(utilDate.getTime());
statement.setDate(2,sqlDate);
statement.setString(3, pa);
statement.executeUpdate();
}
catch(Exception e)
{
JOptionPane.showMessageDialog(null,e.getMessage());
}
}
}
每当我尝试在员工考勤中插入数据时,我会得到以下例外情况:
"Cannot add or update a child row: a foreign key constraint fails"
# 1 楼答案
正如评论者已经说过的,错误告诉你问题所在。“外键约束”冲突意味着您试图使用不存在的父行的外键值将行插入子表
因此,您需要检查父表(Employee)中的数据以及试图插入子表(Attention)中的值。你有一个不匹配
下面是一个完整的工作示例,创建数据库&;插入行,全部填充到单个类中。虽然这是不适合生产的代码,但它是正确插入子行(三次)和不正确插入子行(一次是
demo
方法的最后一行)的有效演示演示的重点是
demo
方法中对insertAttendance
的四个调用。我们得到的employee_
行的标识符为1、2和3。因此,为这三个值中的任何一个插入attendance_
行都会成功当我们尝试一个无效的数字时,我们没有这样的
employee_
,比如4
,那么我们失败了。我们得到一个SQLException,它注意到对foreign keyconstraint的违反。数据库正在执行referential integrity的工作。如果我们没有被阻止,我们将创建一个“孤立”行,一个没有匹配的employee_
行的attendance_
行本例使用纯Java数据库H2 Database。必须添加为依赖项才能运行此代码。易于通过Maven等添加
跑步的时候
示例代码
顺便说一下
您的代码显示您可能对
java.util.Date
和java.sql.Date
感到困惑。第一个是日期和时间,而第二个假装只是日期而没有时间避免使用旧的java。util。Date类(和.Calendar),因为它设计拙劣、混乱且麻烦。使用java。而是将时间内置到Java8和更高版本中
爪哇。sql类型同样糟糕。但我们必须继续使用它们,直到我们的JDBC驱动程序更新为直接使用java。时间类型。在此之前,请使用java。sql类型尽可能简短,以便将数据移入/移出数据库。从java转换。sql转换为java。收到一个值后的时间