【问题标题】:How do I insert primary key value from one table to foreign key column in another?如何将一个表的主键值插入另一个表的外键列?
【发布时间】:2023-03-17 00:27:01
【问题描述】:

我是 SQL 和一般编程的新手,所以如果这个问题的答案很明显,请多多包涵。我有一个名为“tickets”的表,其中包含主键ticket_id。我还有另一个名为“contact_info”的表,它存储创建票证的人的联系信息。在这个表中,ticket_id 是一个名为ticket_number 的外键。用户通过 GUI 插入票据,并且票据编号在数据库中自动递增。如何选择ticket_number 并将其插入到包含创建该ticket 的人的contact_info 的行中?

这是现在的代码,它并没有达到我的预期:

try{
              //Open a connection
              System.out.println("Connecting to a selected database...");
              this.connection = DriverManager.getConnection(url, username, password);
              System.out.println("Connected database successfully...");

              //Execute a query
              System.out.println("Inserting records into the table...");
              PreparedStatement pstmt = connection.prepareStatement(" INSERT INTO s_fuse_ticket_table "
                              + " (summary, status, severity, classification, type, internal_notes, description, assignees) "
                              + " VALUES (?, ?, ?, ?, ?, ?, ?, ?)");

                          if(summary.getText().equals("")){
                              throw new SQLException("Summary cannot be blank");
                          }
                          pstmt.setString(1, summary.getText());
                  pstmt.setString(2, status.getSelectionModel().getSelectedItem().toString());
                  pstmt.setString(3, severity.getSelectionModel().getSelectedItem().toString());
                          if(classification.getSelectionModel().getSelectedItem().toString().equals("Make a Selection")){
                              throw new SQLException("Please select a classification");
                          }
                          pstmt.setString(4, classification.getSelectionModel().getSelectedItem().toString());
                          if(type.getSelectionModel().getSelectedItem().toString().equals("Make a Selection")){
                              throw new SQLException("Please select a type");
                          }
                          pstmt.setString(5, type.getSelectionModel().getSelectedItem().toString());
                          pstmt.setString(6, internalNotes.getText());
                          pstmt.setString(7, description.getText());
                          pstmt.setString(8, assignee.getSelectionModel().getSelectedItem().toString());
                  pstmt.executeUpdate();

                          //Execute a query
                        System.out.println("Inserting records into the table...");
                        PreparedStatement pstmt2 = connection.prepareStatement(" INSERT INTO s_fuse_contact_info_table "
                              + " (ticket_number, email, last_name, first_name) "
                              + " VALUES (?, ?, ?, ?)");

                          pstmt2.setString(1, ("SELECT ticket_id FROM s_fuse_ticket_table"));
                          /*if(!email.getText().contains("@") && !email.getText().contains(".")){

                          }*/
                          pstmt2.setString(2, email.getText());
                          pstmt2.setString(3, lname.getText());
                          pstmt2.setString(4, fname.getText());
                  pstmt2.executeUpdate();
           }catch(SQLException se){
              //Handle errors for JDBC
              se.printStackTrace();
           }catch(Exception e){
              //Handle errors for Class.forName
              e.printStackTrace();
           }finally{
              //finally block used to close resources
              try{
                 if(stmt!=null)
                 {
                    connection.close();
                 }
              }catch(SQLException se){
              }// do nothing
              try{
                 if(connection!=null)
                 {
                    connection.close();
                 }
              }catch(SQLException se){
                 se.printStackTrace();
              }//end finally try
           }//end try
           System.out.println("Goodbye!");

【问题讨论】:

    标签: mysql sql jdbc


    【解决方案1】:

    不同的 DBMS 有不同的方法来做到这一点 - 请参阅 this question 以获得相当全面的列表。

    另一种方法是使用事务。使用处于适当隔离级别(可重复读取或可序列化)的 MVCC DBMS,当您启动新连接时,您将拥有自己的数据库视图,因此您可以INSERT INTO 主表,然后SELECT 最新的行与您的插入相匹配,并确信它属于您。无论如何,将这样的插入捆绑在一起是个好主意,因为它可以防止任何不一致的数据进入系统 - 只需确保您事后提交!

    【讨论】:

    • 非常感谢!这很有帮助,也很容易理解
    • 你能给我一个看起来像你描述的交易的例子吗? (带有捆绑插件)
    • 交易通常以开头
    • 一个事务通常以:BEGIN WORK; 开始,然后您可以执行多个语句:INSERT INTO table1 VALUES (1,2,3,4); INSERT INTO tablea VALUES ('a','b');然后要么“提交”一次应用这两个更改,要么ROLLBACK 撤消它们并恢复数据库。
    • 类似:INSERT INTO ptable (id, name) VALUES (0, "Chips Rafferty"); INSERT into ftable(ptable_id, tag) SELECT max(id), "Actor" FROM ptable WHERE name = "Chips Rafferty"); COMMIT;
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-08-05
    • 1970-01-01
    • 2021-10-25
    • 2018-03-17
    • 2018-08-15
    • 2018-05-24
    • 2018-07-01
    相关资源
    最近更新 更多