从同一个表

时间:2015-08-01 17:51:18

标签: java mysql sql insert resultset

我正在尝试获取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();
}                                        

2 个答案:

答案 0 :(得分:0)

您正在获取外键异常,因为sql2sql3每个都插入一条记录,而外键约束要求在每条记录中填充这两个字段。

您必须将这两者合并为一个插入语句,如:

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(); 
    }