gpt4 book ai didi

java - 我的 Insert Into 语句不起作用

转载 作者:行者123 更新时间:2023-12-02 08:04:04 24 4
gpt4 key购买 nike

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

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` 

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

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

个人信息表:

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

最佳答案

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

不用说,任何表的外键都不应该有默认值。

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

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

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

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

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

关于java - 我的 Insert Into 语句不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8453094/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com