我正在尝试获取JList上的每个项目的 matricule 和来自JTextField的 stage_ID ,并将它们插入表employé_stage中仅包含两列 stage_ID 和 matricule 作为外键,分别引用表 stage 和employés。我希望JList中的所有记录都插入表employé_stage并使用相同的 stage_ID 我使用此代码返回无法添加或更新子行:外部约束失败
private void addstageActionPerformed(java.awt.event.ActionEvent evt){
try{
for (int i = 0; i < stagelist.getModel().getSize(); i++) {
String item = stagelist.getModel().getElementAt(i).toString();
String[] items =item.split(" ");
if(items.length >= 2){
String sql ="INSERT INTO stage (nature,datedebs,datefs,durée_S,commentaire,stage_ID) values(?,?,?,?,?,?) ";
String sql2="INSERT INTO employé_stage (matricule) Select matricule from employés where nom='"+items[0]+"' and prénom='"+items[1]+"' ";
String sql3="INSERT INTO employé_stage (stage_ID) select LAST(stage_ID)from stage ";
ps2 = conn.prepareStatement(sql2);
ps3 = conn.prepareStatement(sql3);
ps = conn.prepareStatement(sql);
ps.setString(6,stageID.getText());
ps.execute();
ps2.execute();
ps3.execute();
}
}
} catch(Exception ev){
JOptionPane.showMessageDialog(null, ev);
}
miseajour_tab();
}
答案 0 :(得分:0)
您正在获取外键异常,因为sql2
和sql3
每个都插入一条记录,而外键约束要求在每条记录中填充这两个字段。
您必须将这两者合并为一个插入语句,如:
String sqlboth="INSERT INTO employé_stage (stage_id, matricule) " +
"( " +
" select LAST(s.stage_ID), e.matricule from stage s, employés e " +
" where e.nom='"+items[0]+"' and e.prénom='"+items[1]+"'" +
")";
此外,您应该在插入中使用占位符,这样您就不会受到SQL注入攻击的攻击。</ p>
String sqlboth="INSERT INTO employé_stage (stage_id, matricule) " +
"( " +
" select LAST(s.stage_ID), e.matricule from stage s, employés e " +
" where e.nom=? and e.prénom=?" +
")";
PreparedStatement psboth = conn.prepareStatement(sqlboth);
psboth.setString(1, items[0]);
psboth.setString(2, items[1]);
psboth.executeUpdate();
答案 1 :(得分:0)
我尝试使用这段代码,但它只能插入JList的第一条记录:
private void addstageActionPerformed(java.awt.event.ActionEvent evt) {
try{
for (int i = 0; i < stagelist.getModel().getSize(); i++) {
String item = stagelist.getModel().getElementAt(i).toString();
String[] items =item.split(" ");
if(items.length >= 2){
String sql2="INSERT INTO employé_stage (stage_id, matricule) " +
"VALUES ( " +
" ?, " +
" (Select matricule from employés where nom='"+items[0]+"' and prénom='"+items[1]+"')" +
")";
ps2 = conn.prepareStatement(sql2);
ps = conn.prepareStatement(sql);
ps2.setString(1,stageID.getText());
ps.execute();
ps2.execute();
}}
} catch(Exception ev){
JOptionPane.showMessageDialog(null, ev);
}
miseajour_tab();
}