如何将新值插入两个相关表?
Posted
技术标签:
【中文标题】如何将新值插入两个相关表?【英文标题】:How can I insert new values into two related tables? 【发布时间】:2012-10-26 14:44:25 【问题描述】:我有一个 java 中的 store 程序和一个 access 中的数据库。我的数据库中已经有 2 个表,分别是客户表和产品表。
我想添加一个订单表,其中它的主键是一个自动编号和一个 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 类型。
我会先做一个选择语句来获取 order_no 值,然后将其放入 order_line 表中的 order_no 中吗?或者我只需要将它放在一个查询中。
有人有这方面的经验吗?任何建议表示赞赏。
【问题讨论】:
使用@@identity 从订单表中获取订单自动编号 【参考方案1】:插入orders 和order_line 表应该在一个事务中发生。这样做时,如果您使用纯 JDBC 将记录插入到订单表中,您可以在 CallableStatement
中的 register the order_no as an OUT parameter 并在语句执行后获取值,并用于设置 order_line
上的 order_no
属性记录。
// 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.
【讨论】:
我意识到我仍然不知道 jdbc 中的很多东西,谢谢你的回答:)【参考方案2】:JDBC方式(如果你喜欢数据库独立),是使用getGeneratedKeys()
方法声明。
使用setAutoCommit(false)
,然后使用选项Statement.RETURN_GENERATED_KEYS
(例如PreparedStatement)执行第一个查询。
然后使用getGeneratedKeys()
方法获取key(注意:按列名引用,因为具体实现和返回的列数取决于驱动实现。
并使用检索到的密钥执行第二条语句。
最后,commit()
。
【讨论】:
以上是关于如何将新值插入两个相关表?的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 Java Spring Boot 在不插入新值的情况下更新表中的现有值
CakePHP 3自定义验证:如何在编辑期间将新值与旧值进行比较?