我们希望从mySQL获取自动增量ID而不实际存储它,直到其他非mysql相关进程成功完成,以便在发生异常或应用程序崩溃时不存储该条目。我们需要使用ID作为其他进程的密钥。从本质上讲,我们希望“保留”自动增量并将行插入mySQL作为最后一步。在我们知道整个过程已成功完成之前,我们不想插入任何行。
是否有可能在mySQL中进行这种自动增量预留?
注意:我知道SQL事务。但是我们的进程包含需要在DB之外发生的非SQL内容。这些过程可能需要几分钟到几个小时。但我们不希望任何其他进程使用相同的自动增量ID。这就是为什么我们想要一个“保留”自动增量ID而不真正将任何数据插入数据库。 -
答案 0 :(得分:8)
生成自动增量值的唯一方法是尝试插入。但是您可以回滚该事务,并仍然读取生成的id。在MySQL 5.1及更高版本中,默认行为是当您回滚时,自动增量值不会“返回”到堆栈。
START TRANSACTION;
INSERT INTO mytable () VALUES ();
ROLLBACK;
SELECT LAST_INSERT_ID() INTO @my_ai_value;
现在您可以确定没有其他事务会尝试使用该值,因此您可以在外部进程中使用它,然后最终手动插入一个使用该id值的值(当您插入特定的id值时, MySQL不会生成新值。)
答案 1 :(得分:1)
您是否考虑过使用mysql tranactions?
它的本质,你启动一个事务,如果所有sql语句都是正确的并且可以被压缩,那么你提交你的事务。如果没有,那么你就像没有发生任何事情一样回滚。
可在此链接中阅读更多详细信息: http://dev.mysql.com/doc/refman/5.0/en/sql-syntax-transactions.html
答案 2 :(得分:1)