根据主表主键值将数据插入子表

时间:2012-05-09 15:06:42

标签: mysql transactions

我目前正在使用电子商务购物网站。描述用户可以随时随地提交订单是非常必要的。

我在MySql数据库orderorder_details中有两个表(还有其他表)来维护我们可以轻易想象的订单详情,因此我认为,我无需描述整个结构两个表格。

order表基本上包含order_id这样的字段,其中包含自动递增的主键order_dateorder_status以及其他一些我们不需要的字段上下文。

order_details表基本上包含order_id这样的字段,order表的{em>外键,product_name,{{1}等等。

当客户提交订单时,要生成的第一个条目位于product_price表中,并且基于此表中的order,此订单的详细信息将插入{ {1}}表。

插入order_id表格需要从订单表中提取相应的order_details(这是自动递增的,因此我们无法提前预订)。我目前正在从order_details表格中获取此order_id

order_id

此SQL语句为order表提供了最新的select max(order_id) from order; ,并使用此值,我可以将特定订单的详细信息插入order_id表。

现在,我们假设我目前正在提交包含购物车中某些产品的订单。我的订单已成功插入order表格,但在插入order_details之前(以及从order表格中检索最大 order_details之前) ,由于某些原因,服务器上的操作系统调度程序将此进程切换为执行另一个客户的订单,并完全完成另一个客户订单的处理(插入到order_id和{order两个表中{1}})。

完成此订单处理(另一个客户的订单)后,我的订单仍处于暂挂状态,开始执行,在从order检索最大 order_details之前,该订单已被切换表。执行上述SQL语句时,它将从order_id表中获取order max,该表与另一个客户的订单相关,与我的相关导致交易处于不一致状态!

我想问的是,如何正确地从order_id表中获取适当的order,该表始终与特定订单相关,并保证 没有交易结束任何时候都有不一致的 状态。这样做的正确方法是什么?

1 个答案:

答案 0 :(得分:1)

MySQL的LAST_INSERT_ID()函数将返回当前连接上第一次成功插入最后INSERT操作的自动递增值。

您的MySQL API通常会提供一些围绕此函数调用的包装器,例如: PHP中的mysql_insert_id()

相关问题