我的Insert Into Statement无效

时间:2011-12-09 23:40:55

标签: java sql database jdbc

我正在使用UI,用户将点击添加按钮添加员工,但是当我这样做时,它会给我一个像这样的错误

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` 

我该如何解决这个问题?我知道我正在使用父键,其外键是用户,并且还注意到父键已经有数据,但似乎我的查询不起作用,为什么呢?我正在使用带有删除级联和更新级联的外键,这样当我删除数据时,所有子表行都将被删除,反之亦然。这是我添加或插入语句的关键

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

用户表:

CREATE TABLE `users` (
  `idusers` int(11) NOT NULL AUTO_INCREMENT,
  `emp_id` varchar(45) DEFAULT NULL,
  `emp_pass` varchar(45) DEFAULT NULL,
  PRIMARY KEY (`idusers`)
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=latin1

Personal_info表:

CREATE TABLE `personal_info` (
    `idpersonal_info` int(11) NOT NULL AUTO_INCREMENT,
    `First_Name` varchar(45) DEFAULT NULL,
    `Middle_Initial` varchar(45) DEFAULT NULL,
    `Last_Name` varchar(45) DEFAULT NULL,
    `Date_Of_Birth` varchar(45) DEFAULT NULL,
    `Marital_Status` varchar(45) DEFAULT NULL,
    `Beneficiaries` varchar(45) DEFAULT NULL,
    PRIMARY KEY (`idpersonal_info`),
    CONSTRAINT `personal_info_ibfk_1`
    FOREIGN KEY (`idpersonal_info`)
    REFERENCES `users` (`idusers`) ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=latin1

3 个答案:

答案 0 :(得分:2)

您正在尝试插入包含6个字段的记录:First_NameMiddle_InitialLast_NameDate_Of_BirthMarital_StatusBeneficiaries。您的架构当前未知,但这些字段似乎都不是您提到的User表的id的候选外键。因此,我认为该外键列有一个默认值,并且User表中缺少该默认值。

毋庸置疑,您不应该为任何表的外键设置默认值。

我正在评论中添加有关您的问题的这些信息并更新您的问题:

外键是子表和父表之间的链接,分别是您的案例中的personal_infousers表。子表的外键列必须引用父表中的键值,这意味着对于子表的FK列中的每个值,父表的链接列中必须有一个值。

现在,在您尝试插入新的personal_info记录的情况下,MySQL会为其分配idpersonal_info,因为您将其定义为自动增量。但由于有一个指向用户表的链接,MySQL会搜索要插入到用户表的idpersonal_info列中的新idusers。当您收到此异常时,您肯定在users表中没有该值。

您可以按如下方式更改表格结构:

CREATE TABLE `personal_info` (
  `idpersonal_info` int(11) NOT NULL AUTO_INCREMENT,
  `user_id` int(11) NOT NULL,

  ... OTHER FIELD DEFINITIONS,

  PRIMARY KEY (`idpersonal_info`),
  CONSTRAINT `user_id_fk_1` FOREIGN KEY (`user_id`) REFERENCES `users` (`idusers`) ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE=InnoDB

您的查询也需要包含user_id字段。所以它会是这样的:

INSERT INTO personal_info
  (`user_id`, `First_Name`, `Middle_Initial`, `Last_Name`, `Date_Of_Birth`, `Marital_Status`, `Beneficiaries`)
VALUES ( .... SET YOUR VALUES HERE. DON'T FORGET TO SET A VALID USER_ID

答案 1 :(得分:0)

在您的Personal_Info表中,您有一个名为“finalpayroll”的列,它指向另一个表(外键)中的列,并且它是必需的(不可为空)。在你的插入中,你没有给它一个值。所以你可以做的就是让这个列可以为空。

或者可能是另一种方式,因为@Konstantin Naryshkin在说

答案 2 :(得分:0)

错误的含义是您尝试将值插入到具有外键的列中,该值不在远程表中。

我假设有一个我们没有看到的用户列。由于您没有明确设置该值,我认为它是默认值。默认值不在父表中。