带有Query的Actionevent不起作用

时间:2011-12-09 15:58:57

标签: java mysql sql database jdbc

我试图做的是,当我单击Add按钮时,它将创建另一个实例,其中有一个QUERY,它将与数据库交互,添加我从JTextFields获得的输入,我还有另外一个问题,它一直给我一个

m.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationException

这是我的行动事件代码

private class AddHandler implements ActionListener {
        public void actionPerformed(ActionEvent event) {

                Personal personal = new Personal(firstTxt.getText(),miTxt.getText(),
                                    lastTxt.getText(),dob.getText(),maritalTxt.getText(),beneTxt.getText());
                Contact contact = new Contact(telTxt.getText(),addTxt.getText(),
                                    mobTxt.getText(),emailTxt.getText());
                Employee employee = new Employee(posTxt.getText(),payTTxt.getText(),payRTxt.getText(),hireTxt.getText());

                Finance finance = new Finance();

                finance.addEmployee(personal,contact,employee);


        }
    }

我的addEmployee代码

public void addEmployee(Personal p ,Contact c,Employee e) {
        Connection conn = Jdbc.dbConn();
        Statement statement = null;
        String insert1 = "INSERT INTO personal_info (`First_Name`, `Middle_Initial`, `Last_Name`, `Date_Of_Birth`, `Marital_Status`, `Beneficiaries`) VALUES ('"+p.getFirstName()+"', '"+p.getMiddleInitial()+"'" +
                "       , '"+p.getLastName()+"', '"+p.getDateOfBirth()+"', '"+p.getMaritalStatus()+"', '"+p.getBeneficiaries()+"')";
        try{
        statement = conn.createStatement();
        statement.executeUpdate(insert1);
        statement.close();
        conn.close();
        JOptionPane.showMessageDialog(null, "Employee Added!!");
        }catch(Exception ex){
            ex.printStackTrace();
        }


    }

这是错误列表

com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationException: Cannot add or update a child row: a foreign key constraint fails (`finalpayroll`.`personal_info`, CONSTRAINT `personal_info_ibfk_1` FOREIGN KEY (`idpersonal_info`) REFERENCES `users` (`idusers`) ON DELETE CASCADE ON UPDATE CASCADE)

如果你们想知道为什么我有外国人,是我给它添加了一个外键,它的外键是idUsers,如果你们想知道为什么我有一个外键,我有一个外键所以,如果我删除行,其他表中的所有其他行都将被删除,但它不起作用。

1 个答案:

答案 0 :(得分:1)

以下是我可以从你的问题中假设的表格。

users          -- idusers, other fields
personal_info  -- idpersonal_info, First_Name, Middle_Initial, Last_Name, 
                  Date_Of_Birth, Marital_Status, Beneficiaries

我假设以下关系:

idusers         - primary key
idpersonal_info - foreign key referencing idusers, 
                  also, it is set to ON DELETE CASCADE, ON UPDATE CASCADE

                  You had set it as primary key with AUTO_INCREMENT also.

来自维基百科Foreign Key

The values in one row of the referencing columns 
must occur in a single row in the referenced table.

如果我理解你的桌面结构,那么它就会让我得出以下结论。

您正在向personal_info表插入新记录,但是省略了idpersonal_info的值,因为它是主要的auto_increment。现在,在插入行之前,MySQL将对您设置的外部约束执行检查。在那里,它检查idpersonal_info表的idusers字段中是否存在users的值。由于您没有为idpersonal_info指定值,因此MySQL可以采用NULLidpersonal_info的自动递增值,MySQL将采用哪一个,我不确定。如果它需要NULL,那么它将不在users表上,因此违反了外键约束。如果它采用auto_incremented值,则有可能它不会出现在users表中,如果不存在,则违反外键约束。

现在,我能想到的解决方案是,您必须在idpersonal_info查询中指定INSERT的值。您必须确保users表中也存在。

希望有所帮助:)