【问题标题】:MySQL using last auto incremented ID from a table in other tablesMySQL 使用来自其他表中的表的最后一个自动递增 ID
【发布时间】:2014-03-08 01:58:07
【问题描述】:

我目前有以下陈述。

INSERT INTO TripsTaken (ProfileId, DestinationLocation, Name, ImageUrl, StartDate, EndDate, Summary, Latitude, Longitude) VALUES ( ?, ?, ?, ?, ?, ?, ?, ?, ?);
INSERT INTO Transportation(Type, Location, StartDate, EndDate) VALUES (?, ?, ?, ?);
INSERT INTO TripsTakenTransportation (TripId, id) VALUES( (SELECT MAX(LAST_INSERT_ID()) FROM TripsTaken) , LAST_INSERT_ID());
INSERT INTO Transportation(Type, Location, StartDate, EndDate) VALUES (?, ?, ?, ?);
INSERT INTO TripsTakenTransportation (TripId, id) VALUES( (SELECT MAX(LAST_INSERT_ID()) FROM TripsTaken) , LAST_INSERT_ID());

我收到以下错误:

{ [错误:ER_NO_REFERENCED_ROW_:无法添加或更新子行:外键约束失败(tripsdatabase.tripstakentransportation,约束tripstakentransportation_ibfk_1外键(TripId)参考TripsTakenTripId ))] 代码:'ER_NO_REFERENCED_ROW_', 错误号:1452, sqlState: '23000', 索引:2 }

只要语句INSERT INTO TripsTakenTransportation... 出现两次,就会发生错误。我怀疑我的子查询 (SELECT MAX(LAST_INSERT_ID()) FROM TripsTaken) 第二次没有达到我的预期。

如何从表中获取 LAST_INSERT_ID()、存储它并在我的其他查询中重用它?

注意:

Transportation 也有一个自动增量列。

【问题讨论】:

  • @Mate 我在阅读文档时可能遗漏了一些东西,但我没有找到解决问题的方法。
  • 将 (SELECT MAX(LAST_INSERT_ID()) FROM TripsTaken) 转换为 (SELECT MAX(ID) FROM TripsTaken) 或在未命名 ID 的情况下使用自动递增的主键
  • @rusben 与数据库的连接很多,所以如果另一个用户在我处理值时更改它,事情就会出错。 LAST_INSERT_ID() 是每个会话的值。
  • 我认为查询是错误的。可能你会喜欢使用sql变量stackoverflow.com/questions/1009954/…

标签: javascript mysql sql


【解决方案1】:

你赋予LAST_INSERT_ID() 比它更多的智慧。你不能说MAX(LAST_INSERT_ID()) FROM table,因为它没有绑定到一张桌子上。

这是你需要的东西:

INSERT INTO TripsTaken 
       (ProfileId, DestinationLocation, Name, 
        ImageUrl, StartDate, EndDate, Summary, Latitude, Longitude) 
VALUES ( ?, ?, ?, ?, ?, ?, ?, ?, ?);

SET @tripsID := LAST_INSERT_ID();

INSERT INTO Transportation
       (Type, Location, StartDate, EndDate) 
VALUES (?, ?, ?, ?);

INSERT INTO TripsTakenTransportation 
       (TripId, id)
VALUES (@tripsID , LAST_INSERT_ID());

LAST_INSERT_ID() 返回最近增加的自动增量列值的值。好消息是每个与 MySQL 的不同连接都有一个 LAST_INSERT_ID() 值,因此您可以依靠它来确保连接中的 SQL 语句与语句的正确性。坏消息是您必须非常小心,不要编辑您的 SQL 代码来添加新的 INSERT 语句,因为它们具有更改 LAST_INSERT_ID() 的副作用。小心破解。

【讨论】:

  • 好陌生人,你刚刚拯救了我的周末。这解决了我的问题。谢谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-09-22
  • 1970-01-01
  • 2016-04-17
  • 1970-01-01
  • 2016-02-19
相关资源
最近更新 更多