如何获取精确插入行的auto_increment主键?

问题描述 投票:0回答:1

我下面有2张桌子

create table Order(
   OrderId int primary key auto_increment,
   UserId int not null,
   OrderDate date not null,
   IsPaid boolean default false,
   (...Reference statement for UserId...)
);

create table OrderProduct(
   OrderId int not null,
   ProductName varcahr(1024) not null,
   constraint `fk_orderid_from_orderProduct`
   foreign key (OrderId) references Order(OrderId)
);

Order代表用户做出的每个订单,表OrderProduct是每个产品包含的产品列表。如您所见,Order表上的主键OrderId是auto_increment。

我想做的事情如下,

  1. 通过INSERT INTO Order SET UserId=1234, OrderDate="2019-10-11";为用户创建空订单
  2. 而且我可以检索哪个数字用作插入的Order(由auto_increment分配)的主键,并假定它是2368
  3. 将产品添加到订单中,INSERT INTO OrderProduct (OrderId, ProductName) VALUES (2368, "iPhone"), (2368, "Toy"), (2368, "Computer);

问题是如何从由auto_increment自动插入的OrderId表中获取准确的Order。如果只有一个会话,并且所有查询都按顺序处理,那么这不是问题。但是对于许多用户创建自己的订单而言,这成为一个问题。 (在这种情况下,通过MAX(OrderId)或LastIndex()(right?)裁剪插入的订单ID并不总是很精确,因为其他用户可以在表中插入另一个订单(这会增加OrderId

我考虑使用查询,例如(SELECT OrderId WHERE UserId =“ alex0123”和OrderDate =“ 2019-10-11”),但这并不是您所知道的答案。它可以裁剪我想要的内容,但不能保证精确,我认为这是不正确的。

[此外,我正在考虑在特定用户的交易时锁定表。但这会导致性能问题。 (当某人处理其订单时,其他人则不能这样做)

有什么办法解决这个问题?还是有任何DB方案或方法可以绕过此问题?

mysql sql mariadb
1个回答
0
投票
您可以使用LAST_INSERT_ID(),因为每个客户端(会话)都会维护它。从手册:
© www.soinside.com 2019 - 2024. All rights reserved.