Php 使用变量作为外键ID将数据插入2个表中

Php 使用变量作为外键ID将数据插入2个表中,php,mysql,Php,Mysql,所以我有两个MySQL表(假设这些是粗糙表),位置是交付的多值属性,所以我决定将其分解为自己的表 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, `Us

所以我有两个MySQL表(假设这些是粗糙表),位置是交付的多值属性,所以我决定将其分解为自己的表

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
) 

因此,我要做的是,我将其各自的数据插入到delivery中,并使用其自己的匹配id将数据添加到location表中。我被告知将多值属性分解到它们自己的表中。所以我一直在做的是

INSERT INTO Delivery 
VALUES (DEFAULT, '12345','10:53am','admin','100','10');

SELECT @Var :=  Last_INSERT_ID();

INSERT INTO Location
VALUES (@Var, '1234','address',DEFAULT);

我的问题是,这种做法不好吗?或者有什么办法可以解决这个问题,比如有一个更大的传送表,里面有所有的位置数据?我担心的是,如果我有多个数据库用户,他们可能会以某种方式插入到传递表中,并在从表中获取最大值(DeliveryID)所需的0.0005秒内破坏我的同步?对于这种规模的项目,我知道这不会是一个问题,但如果这是一个大规模的项目,是否会像我提到的那样出现错误?

您应该使用最后插入的id()。在使用MAX()执行额外选择之前从未遇到过您的方法,是的,您可能会使用该方法获取错误的id。

您应该使用最后插入的id()。在使用MAX()执行额外选择之前从未遇到过您的方法,是的,您可能会使用这种方法获取错误的id。

最好使用
LAST\u INSERT\u id()
,因为它是由会话维护的。 会话仍然可以共享,但从表中获取max键的风险肯定更小

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

请记住,LAST_INSERT_ID()仅适用于自动递增键

另一种方法是从交货表中选择最后一个项目(按交货顺序_iddesc),该项目符合确定项目唯一性的所有标准,例如用户名称、日期、订单总数。这样,您就可以确信记录已成功创建,并且您拥有正确的id


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

最好使用
LAST\u INSERT\u ID()
,因为它是由会话维护的。 会话仍然可以共享,但从表中获取max键的风险肯定更小

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

请记住,LAST_INSERT_ID()仅适用于自动递增键

另一种方法是从交货表中选择最后一个项目(按交货顺序_iddesc),该项目符合确定项目唯一性的所有标准,例如用户名称、日期、订单总数。这样,您就可以确信记录已成功创建,并且您拥有正确的id


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

您能使用
SET@Var=LAST\u INSERT\u ID()吗?我更改了它,它给我的结果与使用max-ID相同,它应该这样做,是什么使它比使用max(ID)更安全或更不安全?你能使用
SET@Var=LAST\u INSERT\u ID()吗?我更改了它,它给我的结果与使用max ID相同,它应该,是什么使它比使用max(ID)更安全或更不安全?使用Last_INSERTED_ID()会使它更安全或更不安全吗?或者将地址、街道和APT#扔进投递表就是最好的方法吗?是的,使用起来更安全、更理智。据mysql称,“生成的ID在服务器中按每个连接进行维护。这意味着函数返回给给定客户机的值是为影响该客户机自动增量列的最新语句生成的第一个自动增量值。此值不受其他客户端的影响,即使它们生成自己的自动增量值。此行为确保每个客户端都可以检索自己的ID,而不必关心其他客户端的活动,也不需要锁或事务。“有一次,我注意到php、mysql和上次插入的id的行为不确定,那就是在插入查询之后,但在获取上次插入的id之前,使用php的PDO执行SELECT查询(插入->随机选择->选择上次插入的id())。由于某些原因,您最终得到了0。现在它可能是我正在使用的框架或其他东西,但我并没有仔细研究它,因为它对我来说是一个边缘情况。使用Last_INSERTED_ID()这会使它变得更安全还是更不安全?或者,完美的方法是将Address、street和APT#放入传送表中吗?是的,使用起来更安全、更理智。根据mysql,“生成的ID在服务器中以每个连接为基础进行维护。这意味着函数返回给给定客户机的值是为影响该客户机自动增量列的最新语句生成的第一个自动增量值。此值不受其他客户端的影响,即使它们生成自己的自动增量值。此行为确保每个客户端都可以检索自己的ID,而不必关心其他客户端的活动,也不需要锁或事务。“有一次,我注意到php、mysql和上次插入的id的行为不确定,那就是在插入查询之后,但在获取上次插入的id之前,使用php的PDO执行SELECT查询(插入->随机选择->选择上次插入的id())。由于某些原因,您最终得到了0。现在它可能是我正在使用的框架或其他东西,但我没有仔细研究它,因为它对我来说是一种边缘情况。是的,
order by
比使用
max()
安全得多。
order by
比使用
max()安全得多。
INSERT INTO Delivery 
VALUES (DEFAULT, '12345','10:53am','admin','100','10');

SELECT @Var :=  Last_INSERT_ID();

INSERT INTO Location
VALUES (@Var, '1234','address',DEFAULT);