所以我有两个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)时弄乱我的同步?对于这样规模的项目,我知道它不会成为一个问题,但如果这是一个大规模的项目,可能会出现如我所提到的错误吗?
答案 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。