我下面有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。
我想做的事情如下,
INSERT INTO Order SET UserId=1234, OrderDate="2019-10-11";
为用户创建空订单Order
(由auto_increment分配)的主键,并假定它是2368
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方案或方法可以绕过此问题?
LAST_INSERT_ID()
,因为每个客户端(会话)都会维护它。从手册: