我正在使用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
答案 0 :(得分:2)
您正在尝试插入包含6个字段的记录:First_Name
,Middle_Initial
,Last_Name
,Date_Of_Birth
,Marital_Status
和Beneficiaries
。您的架构当前未知,但这些字段似乎都不是您提到的User
表的id的候选外键。因此,我认为该外键列有一个默认值,并且User表中缺少该默认值。
毋庸置疑,您不应该为任何表的外键设置默认值。
我正在评论中添加有关您的问题的这些信息并更新您的问题:
外键是子表和父表之间的链接,分别是您的案例中的personal_info
和users
表。子表的外键列必须引用父表中的键值,这意味着对于子表的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)
错误的含义是您尝试将值插入到具有外键的列中,该值不在远程表中。
我假设有一个我们没有看到的用户列。由于您没有明确设置该值,我认为它是默认值。默认值不在父表中。