[英]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);? 我把它放在正確的位置了嗎? (繼續構建可測試的原型)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.