Java 无法从代码插入中间表,但在MySQL中从phpmyadmin执行时,它会正确插入中间表

Java 无法从代码插入中间表,但在MySQL中从phpmyadmin执行时,它会正确插入中间表,java,mysql,jdbc,phpmyadmin,javadb,Java,Mysql,Jdbc,Phpmyadmin,Javadb,我最近需要在数据库中添加一个中间表。一切都在innoDB中。我在软件上使用Java,除了SQL命令,我从来没有遇到过问题。在插入表并将其与我实现的代码一起设置之后,我可以从java向表中插入数据。它总是给出同样的错误 Cannot add or update a child row: a foreign key constraint fails (`jjeventoscorev3`.`event_category_link`, CONSTRAINT `event_ca

我最近需要在数据库中添加一个中间表。一切都在innoDB中。我在软件上使用Java,除了SQL命令,我从来没有遇到过问题。在插入表并将其与我实现的代码一起设置之后,我可以从java向表中插入数据。它总是给出同样的错误

    Cannot add or update a child row: a foreign key constraint fails 
    (`jjeventoscorev3`.`event_category_link`, CONSTRAINT 
    `event_category_link_ibfk_1` FOREIGN KEY (`event_category_id`) 
    REFERENCES `event_category` (`event_category_id`))
我检查了查询:

    insert into event_category_link (event_link_id, event_id, 
    event_category_id) values (NULL,118,1)
然后我尝试在phpmyadmin上执行它。id在同一查询下成功地完成了该操作。 我真的不知道如何调试它。该代码与我在其他中间表中使用的代码相同,没有什么特别之处

这是我在java上成功地在表上使用的代码:

 try{con = (Connection) DriverManager.getConnection("jdbc:mysql://"+home.credentials[0],home.credentials[1],home.credentials[2]);
            String query3 = " insert into client_event (client_id, event_id)"
            + " values (?, ?)";/*query para insertar en la tabla intermedia*/
            PreparedStatement preparedStmt3 = con.prepareStatement(query3);
            if(existing == false){/*si existe se manda el ids[0]*/
                preparedStmt3.setInt (1, ids[0]); //cliente
            }
            else{
                preparedStmt3.setInt (1, id_existing); /*se manda el id existente*/
            }
            preparedStmt3.setInt (2, ids[1]); //evento
            preparedStmt3.execute();
            con.close();
            JOptionPane.showMessageDialog(new JFrame(), "Evento añadido");
            pnlone1.continue_doc = true; /*se cambia el valor de continue_doc en el pnlone para poder generar el archivo*/
        }
        catch (Exception e){
            System.err.println("Got an exception! in 3");
            System.err.println(e.getMessage());
            continuar = false; /*se pasa a falso para no continuar con la operación*/
            System.out.println(e.getMessage());
            JOptionPane.showMessageDialog(new JFrame(), "Error: verificar datos");
        }
这是我在表上使用的代码,我得到了错误:

      if(continuar == true){
        System.out.println("Iniciando tabla de eventos conectados");
        try{con = (Connection) DriverManager.getConnection("jdbc:mysql://"+home.credentials[0],home.credentials[1],home.credentials[2]);
            String query4 = " insert into event_category_link (event_link_id, event_id, event_category_id)"
            + " values (NULL,"+ids[1]+","+eventlist.get(0)+")";/*query para insertar en la tabla intermedia*/

            //INSERT INTO `event_category_link` (`event_link_id`, `event_id`, `event_category_id`) VALUES (NULL, '105', '27');
            PreparedStatement preparedStmt4 = con.prepareStatement(query4);
            System.out.println(preparedStmt4);
            preparedStmt4.execute();
            con.close();
            JOptionPane.showMessageDialog(new JFrame(), "Relacion añadida");
        }catch (Exception e){
            System.err.println("Got an exception! in 4");
            System.err.println(e.getMessage());
            JOptionPane.showMessageDialog(new JFrame(), "Error: verificar datos");
        }
在这里,您可以看到PhpMyAdmin如何完美地执行它


我非常感谢你的帮助。谢谢

错误告诉您,您尝试插入的
事件\u类别\u id
在您尝试插入时不存在。您应该将此视为事实,并检查您的代码,看看情况如何。可能尝试直接在您的
query4
检查值
“eventlist.get(0)”
是否实际在表中。然后往回走,检查该值来自何处

有几个原因可以让您稍后在phpmyadmin中执行它(它们不应该让您误以为该值确实丢失了,但可能有助于缩小查找范围):

  • 缺少的值现在已存在。例如,如果插入丢失的
    事件_category_id
    的代码在插入失败后运行(并且您在外键错误发生后继续应用程序),则可能发生这种情况。或者插入到
    事件类别
    发生在与插入到
    事件类别链接
    不同的事务中,尚未提交,因此可用(因为您似乎为每个查询打开了一个新连接)。或者您的代码意外地删除/更新了
    事件\u类别\u id
    ,但由于该错误,事务可能会回滚,因此当您在phpmyadmin上进行测试时,它再次可用
  • 这实际上不是(完全)相同的查询。您在应用程序代码中使用
    value
    ,并在测试的查询中用
    value
    '
    -引号括起您的值,这是可疑的。尝试实际复制和粘贴。数千年来,人们一直盯着完全相同但却不相同的代码。在您的情况下,例如
    '01'
    01
    的行为可能完全不同
  • 如果错误发生在不同的位置,例如,在代码的另一部分插入到该表中,则会得到该错误的变体。您的异常消息包含“4”标记,因此我假设您能够识别正确的代码,但它可能值得验证。例如,您可以通过对具有违反外键约束的触发器的不同表执行某些操作来间接获取此错误
  • 您可能正在其他数据库上运行查询。您的数据库似乎有4个版本,可能您的应用程序(或此特定查询)连接到的是与phpmyadmin不同的版本
  • 您可以在phpmyadmin中禁用外键检查(这将允许您绕过检查)。虽然我的西班牙语(?)有点生疏,但它应该是图像中的最后一个复选框,并且它已被选中,所以可能不是它