【问题标题】:Foreign key violation error on row insert [duplicate]行插入外键违规错误[重复]
【发布时间】:2015-04-20 14:53:15
【问题描述】:

当我试图通过 jdbc 将值插入下表时,我收到错误

数据库架构

CREATE TABLE student_contact_details_t(
    student_contact_details_id MEDIUMINT NOT NULL AUTO_INCREMENT,
    student_id MEDIUMINT NOT NULL ,
    contact_relation_type_id MEDIUMINT NOT NULL,
    name varchar(255),
    addresss varchar(255),
    phone_no varchar(255),
    created_by varchar(255),
    created_date DATE,
    modified_by varchar(255),
    modified_date DATE,
    PRIMARY KEY(student_contact_details_id),
    FOREIGN KEY(student_id) REFERENCES student_details_t(student_id),
    FOREIGN KEY(contact_relation_type_id) REFERENCES contact_relation_type_t(contact_relation_type_id)
);

代码

public void saveStudentContactDetails(
        StudentContactDetailsTO studentContactDetails)
        throws ClassNotFoundException, SQLException, IOException {
    try {
        int autoId = 0;
        String Insertquery = "insert into student_contact_details_t(student_id,contact_relation_type_id,name,addresss,phone_no,created_by,created_date,modified_by,modified_date)values(?,?,?,?,?,?,?,?,?)";
        PreparedStatement prepareStatement = JDBCConnectionUtil
                .getConnection().prepareStatement(Insertquery,
                        Statement.RETURN_GENERATED_KEYS);
        ResultSet studentId = prepareStatement.getGeneratedKeys();

        prepareStatement.setInt(1, studentContactDetails.getStudentId());

        // prepareStatement.setInt(2,studentId.getInt(1));
        prepareStatement.setInt(2, autoId);
        prepareStatement.setString(3, studentContactDetails.getName());
        prepareStatement.setString(4, studentContactDetails.getAddress());
        prepareStatement.setString(5, studentContactDetails.getPhoneNo());
        prepareStatement.setString(6, "sysadmin");
        prepareStatement.setString(7, DateUtil.getDate().format(date));
        prepareStatement.setString(8, "sysadmin");
        prepareStatement.setString(9, DateUtil.getDate().format(date));
        prepareStatement.executeUpdate();
        while (studentId.next()) {
            autoId = studentId.getInt(1);
            System.out.println(autoId);
        }
    } catch (ClassNotFoundException | SQLException | IOException e) {
        throw e;
    }
}

异常

com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationException: Cannot add or update a child row: a foreign key constraint fails (`studentregistration`.`student_contact_details_t`, CONSTRAINT `student_contact_details_t_ibfk_1` FOREIGN KEY (`student_id`) REFERENCES `student_details_t` (`student_id`))
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
    at java.lang.reflect.Constructor.newInstance(Constructor.java:408)
    at com.mysql.jdbc.Util.handleNewInstance(Util.java:377)
    at com.mysql.jdbc.Util.getInstance(Util.java:360)

【问题讨论】:

  • 我很困惑。您的标题说您在加载数据库配置时遇到错误,但异常说您遇到约束违规,这意味着您已连接到数据库正常。是哪个?
  • 我正在连接我的数据库。同时尝试使用结果集生成的键来获取父表主键并将数据插入到子表中。我遇到了这个异常。

标签: java jdbc


【解决方案1】:

错误表明您在表student_contact_details_t 中插入student_contact_details_t 中不存在student_details_t 表中的student_id 破坏了您在student_contact_details_t 表创建期间设置的外键约束。

所以你必须先插入表student_details_t 然后插入student_contact_details_t 和student_id

【讨论】:

    【解决方案2】:

    您必须验证学生表student_details_t中是否存在学生ID。

    如果 student_details_t 中不存在该学生,则无法在相关表 student_contact_details_t 中插入该学生。

    在这种情况下,您应该告诉用户“学生 XXX 不存在”。

    【讨论】:

      猜你喜欢
      • 2017-04-20
      • 2018-11-12
      • 2018-02-22
      • 2016-08-02
      • 1970-01-01
      • 2016-04-14
      • 2020-10-21
      • 2011-11-28
      • 2021-09-03
      相关资源
      最近更新 更多