使用一个变量作为外键的ID向2个表中插入数据


Inserting data into 2 tables using a variable as the ID for the foreign key

所以我有两个MySQL表(让我们说这些是粗略的表)Location是Delivery的多值属性,所以我决定把它分解成它自己的表

CREATE TABLE `Delivery` (
  `Date` varchar(10) NOT NULL,
  `Time` varchar(10) NOT NULL,
  `OrderTotal` float NOT NULL,
  `DeliveryID` int(11) PRIMARY KEY AUTO_INCREMENT ,
  `Tip$` float NOT NULL,
  `Username` varchar(50) NOT NULL
) 

CREATE TABLE `Location` (
  `DeliveryID` int(10) NOT NULL,
  `APT` varchar(10) DEFAULT NULL,
  `Street` varchar(50) NOT NULL,
  `Address` int(20) NOT NULL, 
) FOREIGN KEY ('DeliveryID') REFERENCES `Delivery` (`DeliveryID`);

所以我想做的是,我插入到delivery中,并将数据添加到位置表中,并将其id与delivery相匹配。我被告知要将多值属性分解到它们自己的表中。所以我一直在做的是

INSERT INTO Delivery 
VALUES (DEFAULT, '12345','10:53am','admin','100','10');
SELECT @Var :=  Last_INSERT_ID();
INSERT INTO Location
VALUES (@Var, '1234','address',DEFAULT);
我的问题是,这是不好的做法吗?或者有没有办法绕过这个,比如有一个更大的Delivery表,里面有所有Location数据?我担心的是,假设我有这个数据库的多个用户,他们将能够以某种方式插入到交付表中,并在0.0005秒内从表中获取MAX(DeliveryID)来打乱我的同步?对于这种规模的项目,我知道这不会是一个问题,但如果这是一个大型项目,是否会像我提到的那样出现错误?

最好使用LAST_INSERT_ID(),因为它是按会话维护的。会话仍然可以共享,但它肯定比从表中获取max键的风险要小。

如果在同一个表中有多个会话插入,那么MAX()

肯定会出现问题

请记住,LAST_INSERT_ID()只适用于自动增加的键。

另一种方法是从配送表中选择最后一项商品(按delivery_id desc订购的商品),它匹配标识商品唯一的所有条件——例如用户名、日期、订单总额。然后,您可以确信记录已成功创建,并且您拥有正确的id。

我还建议您在位置表中添加一个主键

您应该使用最后插入的id代替(https://dev.mysql.com/doc/refman/5.5/en/information-functions.html#function_last-insert-id)。在使用MAX()进行额外选择之前从未遇到过您的方法,是的,您有可能使用该方法获取错误的id。