如何将新值插入两个相关表中?

时间:2012-10-26 14:44:25

标签: java sql ms-access jdbc

我在java中有一个商店程序,在访问中有一个数据库。我的数据库中已有2个表,即customers表和products表。

我想添加一个订单表,其中主键是自动编号和order_line表来完成此应用。我想要这样的桌子..

customer(cust_id, name, ....)
orders(order_no, cust_id, date_purchased,...)
order_line(order_no, product_id, ...)
products(product_id, product_name, price,....)

当客户购买产品时,我可以在订单表中插入新值。我不清楚的是我怎样才能在order_line表中插入,因为我在access中创建的order_no是autonumber类型。

我会首先使用select语句获取order_no值以将其放入order_line表中的order_no吗?或者我只需要将它放在一个查询中。

有经验的人吗?任何建议都表示赞赏。

2 个答案:

答案 0 :(得分:1)

插入订单和order_line表应该在单个事务中进行。执行此操作时,如果您使用普通JDBC将记录插入到订单表中,则可以register the order_no as an OUT parameter中的CallableStatement并在执行语句后获取值并用于设置order_no属性order_line记录。

 // begin transaction
 connection.setAutoCommit(false);

 CallableStatement cs = connection.prepareCall(INSERT_STMT_INTO_ORDERS_TABLE);
 cs.registerOutParameter(1, Types.INT);
 int updateCount = cs.execute();
 // Check the update count.
 long orderNo = cs.getInt(1);

 // CallableStatement csLine for inserting into order_line table
 // for (OrderLine line: orderLines) {
 //     Set the orderNo in line.
 //     set paramters on csLine.
 //     csLine.addBatch();
 // }
 // run the batch and verify update counts
 connection.commit();

 // connection.rollback() on error.

答案 1 :(得分:1)

JDBC-way(如果你喜欢数据库独立性)是使用getGeneratedKeys()语句方法。

使用setAutoCommit(false),然后使用选项Statement.RETURN_GENERATED_KEYS执行第一个查询(例如PreparedStatement)。

然后使用getGeneratedKeys()方法检索密钥(注意:按列名引用,因为确切的实现和返回列的数量取决于驱动程序的实现。

使用检索到的密钥执行第二个语句。

最后,commit()