Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何将主键的Id填充到外键_Java_Sql_Database_Jdbc - Fatal编程技术网

Java 如何将主键的Id填充到外键

Java 如何将主键的Id填充到外键,java,sql,database,jdbc,Java,Sql,Database,Jdbc,我刚刚开始学习Java JDBC,我试图创建一个示例项目,我创建了两个准备好的语句,在其中为我的表插入了两个查询。第一个表用于主键,第二个表用于外键。使用语句_RETURN.GENERATED_KEYS返回主键的Id,但在我的外键中,它不会填充并向我抛出null值 父表 子表 查询: String insertALLSECTION_LIST = "INSERT INTO ALLSECTIONS_LIST (SECTION_NAME)" + "VALUES (?

我刚刚开始学习Java JDBC,我试图创建一个示例项目,我创建了两个准备好的语句,在其中为我的表插入了两个查询。第一个表用于主键,第二个表用于外键。使用语句_RETURN.GENERATED_KEYS返回主键的Id,但在我的外键中,它不会填充并向我抛出null值

父表

子表

查询:

    String insertALLSECTION_LIST = "INSERT INTO ALLSECTIONS_LIST (SECTION_NAME)"
            + "VALUES (?)";
    String insertALLSECTIONS_SETTINGS = "INSERT INTO ALLSECTIONS_SETTINGS (SECTION_POPULIMIT,ROOM_ASSGN,ADVISER_ASSIGNED,SESSION_ASSIGNED,YRLEVEL_ASSGN,SCHOOL_YEAR)"
            + "VALUES(?,?,?,?,?,?)";
准备好的声明

    ResultSet generatedKeys = null;
    try (Connection myConn = DBUtil.connect())//Connection
    {
            myConn.setAutoCommit(false);//Turn off auto commit
            try (PreparedStatement myPs = myConn.prepareStatement(insertALLSECTION_LIST,Statement.RETURN_GENERATED_KEYS))//Prepared Statement
            {
                myPs.setString(1,inputSectionName);

                myPs.executeUpdate();

                myConn.commit();

                generatedKeys = myPs.getGeneratedKeys();
                if (generatedKeys.next())//Return ID
                {
                    sectionID = generatedKeys.getInt(1);
                }
                else
                {
                    throw new SQLException("No generated section ID returned");
                }

            }//end of try
            finally 
            {
                if (generatedKeys != null) generatedKeys.close();
            }//end of finally
            try (PreparedStatement myPs = myConn.prepareStatement(insertALLSECTIONS_SETTINGS))//Prepared Statement
            {
                myPs.setInt(1,inputStudentLimit);
                myPs.setString(2, inputRoomAssign);
                myPs.setString(3, inputAdviserAssign);
                myPs.setString(4, inputSession);
                myPs.setString(5, inputYearLevel);
                myPs.setString(6, inputSchoolYear);

                myPs.executeUpdate();

                myConn.commit();

                JOptionPane.showMessageDialog(null, "Insert Successful");
            }//end of try
    }//end of try       
第一个表格(所有章节列表)

正如您在这里看到的,主键正在填充

第二张表格(所有章节设置)

在这里,我的SECTION\u ID列给我空值


但当我对我的表运行查询时。仍然为我的外键提供空值。请随意评论。谢谢。

一旦您从第一条准备好的语句中获得自动生成的密钥,您就必须手动将其插入到另一个表中

以下是修改后的查询:

String insertALLSECTION_LIST = "INSERT INTO ALLSECTIONS_LIST (SECTION_NAME)"
        + "VALUES (?)";

String insertALLSECTIONS_SETTINGS = "INSERT INTO ALLSECTIONS_SETTINGS (SECTION_ID,
        SECTION_POPULIMIT,ROOM_ASSGN,ADVISER_ASSIGNED,
        SESSION_ASSIGNED,YRLEVEL_ASSGN,SCHOOL_YEAR)"
        + "VALUES(?,?,?,?,?,?,?)";
以下是代码片段:

ResultSet generatedKeys = null;
try (Connection myConn = DBUtil.connect()) {
    myConn.setAutoCommit(false);
    try (PreparedStatement myPs = myConn.prepareStatement(insertALLSECTION_LIST,
      Statement.RETURN_GENERATED_KEYS)) {
        myPs.setString(1,inputSectionName);
        myPs.executeUpdate();

        myConn.commit();
        generatedKeys = myPs.getGeneratedKeys();
        if (generatedKeys.next()) {
            sectionID = generatedKeys.getInt(1);
        } else {
            throw new SQLException("No generated section ID returned");
        }
    } finally {
        if (generatedKeys != null) generatedKeys.close();
    }

    try (PreparedStatement myPs = myConn.prepareStatement(insertALLSECTIONS_SETTINGS)) {
        /* Note : Change Here */
        myPs.setInt(1, sectionID);
        myPs.setInt(2, inputStudentLimit);
        myPs.setString(3, inputRoomAssign);
        myPs.setString(4, inputAdviserAssign);
        myPs.setString(5, inputSession);
        myPs.setString(6, inputYearLevel);
        myPs.setString(7, inputSchoolYear);
        myPs.executeUpdate();

        myConn.commit();
        JOptionPane.showMessageDialog(null, "Insert Successful");
    }
}      

返回生成的键的语句返回主键的Id,但它不填充在外键中。我有点困惑。我看不到您将从第一个PS获得的密钥,即
sectionID
,插入到第二个PS的任何位置。我错过什么了吗?嗨@user2004685我刚刚更新了我的帖子。请再检查一遍。谢谢给你投票,兄弟!我已经知道我的错误了。我发现我需要手动插入到其他表中。我认为自动生成的键会自动将值插入到我的第二个表中。谢谢@米娅:不客气