簡體   English   中英

當它引用的字段是自動遞增的時,如何有效地模仿外鍵約束?

[英]How can I efficiently mimic a foreign key constraint when the field it references is autoincrementing?

我正在嘗試為書店創建數據庫應用程序。

在規范中:“注冊后,用戶可以訂購一本或多本書籍。訂購總額應報告給他/她。用戶可以訂購一本或多本書籍的多個副本。”

總金額似乎還不錯。

這是兩個相關的表:

Order( orderID :INT(11),loginName:VARCHAR(45),date:DATETIME)

BooksOrdered( orderID :INT(11), ISBN :VARCHAR(45),計數:INT(11))

粗體字是PK。

現在,這是要解決的問題:我們的數據庫不允許FK出現性能問題,因此我應該在應用程序層中模擬它們。 BooksOrdered.orderID實際上是一個FK,只是沒有特別說明。 此外,Order.orderID是自動遞增的。

我試圖弄清楚如何在插入新訂單時確保orderID匹配(模仿外鍵約束)。

基本上,我不了解如何在給定ArrayList的情況下有效地插入訂單(BookOrder將僅包含一個ISBN和一個計數)。

我想到的一種解決方案是:

每當我想在BooksOrdered中添加一行時,只需從Order中獲取最大的orderID。 這似乎效率低下,我認為可能還有其他問題(並發訪問/插入?)。

因此,我問你,我應該如何模仿這種自動遞增的FK? 還是您建議我重組表?

還是有一種方法可以神奇地抓住我在Order ...中插入的最后一個OrderID?

編輯:

好的,所以我有以下不完整的功能:

public int orderBooks(String loginName, ArrayList<BookOrder> bookOrders) throws Exception{

    int id = -1;
    //Working on the date situation
    java.util.Date today = new java.util.Date();
    Timestamp sqlDate = new java.sql.Timestamp(today.getTime());

    Connector con=null;
    String query = "INSERT INTO Order (loginName, date) " +
            " VALUES ('"+loginName+"', "+sqlDate+")";
    ResultSet rs; 


    try{
        con= new Connector();
        con.stmt.executeUpdate(query, Statement.RETURN_GENERATED_KEYS);
        rs = con.stmt.getGeneratedKeys();
        if (rs.next()) {
            id = rs.getInt(1);
        } else {
            throw(new Exception()); // mmm...
            // throw an exception from here
        }
        con.stmt.close();
    } catch(Exception e) {
        System.err.println("Unable to execute query:"+query+"\n");
        System.err.println(e.getMessage());
        throw(e);
    }
    finally
     {
         if (con != null)
         {
             try
             {
                 con.closeConnection();
             }
             catch (Exception e) { /* ignore close errors */ }
         }
     }




    return id;
}

現在,我應該在哪里放置id = stmt.executeUpdate(query,Statement.RETURN_GENERATED_KEYS);? 我把它放在正確的位置了嗎? (繼續構建可測試的原型)

您使用哪種語言? 它可能具有從當前數據庫句柄中檢索最后一個自動遞增的值的功能。 例如,在PHP中,您將使用mysql_insert_id()doc )。 在Perl DBI中,可以使用last_insert_id() DBI文件

對於您想要在executeUpdate中設置標志:

id = stmt.executeUpdate(query, Statement.RETURN_GENERATED_KEYS);

還有stmt.getGeneratedKeys()函數。 請參閱文檔 executeUpdate條目位於getGeneratedKeys下方。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM