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

时间:2016-10-28 19:28:46

标签: php mysql

所以我有两个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`);

所以我想要做的就是说我使用自己的相应数据插入交付,并将数据添加到位置表,其中显然有自己的匹配ID。我被告知要将多值属性分解到自己的表中。所以我一直在做的是

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

SELECT @Var :=  Last_INSERT_ID();

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

我的问题是,这是不好的做法吗?或者有没有办法解决这个问题,比如只是拥有一个包含所有位置数据的更大的交付表?我担心,就是说我有这个数据库的多个用户,不知何故,他们将能够插入到交付表中,并在0.0005秒内从表中获取MAX(DeliveryID)时弄乱我的同步?对于这样规模的项目,我知道它不会成为一个问题,但如果这是一个大规模的项目,可能会出现如我所提到的错误吗?

2 个答案:

答案 0 :(得分:2)

使用LAST_INSERT_ID()要好得多,因为它是由会话维护的。 会话仍然可以共享,但从表中获取最大密钥肯定风险较小。

如果您在同一个表中插入了多个会话,那么您肯定会遇到MAX()

的问题

请记住,LAST_INSERT_ID()仅适用于自动递增的密钥。

另一种方法是从交货表中选择最后一个项目(按delivery_id desc排序),该项目与标识项目唯一的所有标准相匹配 - 例如。 useraname,日期,订单总数。然后,您可以确信已成功创建记录并且您具有正确的ID。

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

答案 1 :(得分:0)

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