保留mySQL自动递增ID?

保留mySQL自动递增ID?,mysql,sql,transactions,auto-increment,Mysql,Sql,Transactions,Auto Increment,我们希望在其他与mySQL无关的进程成功完成之前,从mySQL获取一个自动增量ID,而不实际存储它,以便在发生异常或应用程序崩溃时不会存储该条目。我们需要将ID用作其他进程的密钥。本质上,我们希望“保留”自动增量,并在最后一步将行插入mySQL。在知道整个过程已成功完成之前,我们不希望插入任何行 可以在mySQL中进行这种自动增量保留吗 注意:我知道SQL事务。但我们的流程包含非SQL内容,需要在DB之外进行。这些过程可能需要几分钟到几个小时。但我们不希望任何其他进程使用相同的自动增量ID。这就

我们希望在其他与mySQL无关的进程成功完成之前,从mySQL获取一个自动增量ID,而不实际存储它,以便在发生异常或应用程序崩溃时不会存储该条目。我们需要将ID用作其他进程的密钥。本质上,我们希望“保留”自动增量,并在最后一步将行插入mySQL。在知道整个过程已成功完成之前,我们不希望插入任何行

可以在mySQL中进行这种自动增量保留吗


注意:我知道SQL事务。但我们的流程包含非SQL内容,需要在DB之外进行。这些过程可能需要几分钟到几个小时。但我们不希望任何其他进程使用相同的自动增量ID。这就是为什么我们希望在不向数据库中插入任何数据的情况下“保留”自动增量ID

您考虑过使用mysql传输吗

本质上,您启动了一个事务,如果所有sql语句都是正确的并且可以被编译,那么您就提交了您的事务。如果没有,则回滚,就好像什么都没发生一样

更多详细信息可在此链接中阅读:

您可以将临时表与事务一起使用

若事务完成,临时表将消失,并将数据移动到实际表


生成自动增量值的唯一方法是尝试插入。但是您可以回滚该事务,并且仍然可以读取生成的id。在MySQL 5.1及更高版本中,默认行为是回滚时不会将自动增量值“返回”到堆栈

START TRANSACTION;
INSERT INTO mytable () VALUES ();
ROLLBACK;
SELECT LAST_INSERT_ID() INTO @my_ai_value;

现在您可以确保没有其他事务尝试使用该值,因此您可以在外部进程中使用该值,然后最后手动插入使用该id值的值(当您插入特定id值时,MySQL不会生成新值)。

这可能是最好的解决方案(考虑到简短的问题描述,很难确定)。问题海报应该注意的一个重要细节是,事务只在InnoDB表上工作。谢谢。我知道SQL事务。但是我们的流程包含需要在DB之外发生的非SQL内容。这些流程可能需要几分钟到几个小时。但我们不希望任何其他流程使用相同的自动增量ID。这就是为什么我们要“保留”一个自动递增的ID,没有向数据库中插入任何数据。@SaqibAli您能提供更多关于您的问题的详细信息吗?看起来有很多事情需要考虑,但不在描述中。因此,我在原始问题中添加了一些详细信息。希望有帮助。看起来@Bill Karwin response可以解决问题诀窍。你认为这种方法怎么样?你能提供更多的细节吗?大致如下:(1)一个过程开始了。(2)数据库发生了一些事情。(3)发生了其他事情……等等。您可能无法使用自动递增。如果您将当前id计数器存储在其他地方的一个小表中,那么当外部进程开始时,它可以获取当前id并递增它。在崩溃的情况下,id可能会被跳过,但不会重复。@AldenW。请查看Bill Karwin的响应。您认为是这样吗这是一个好方法吗?嗨,比尔。这确实是一个有用的回答。听起来正是我们需要的。您以前尝试过这种方法吗?我们应该注意什么?表的所有其他列都需要允许NULL,或者具有默认值。或者您需要为这些列指定伪值。不,最后一个\u INSERT\u ID()仅报告当前会话中最后生成的ID。它永远不会报告其他会话生成的ID。如果该函数易受竞争条件的影响,则该函数将非常无用。请使用com.mysql.jdbc.jdbc2.optional.MysqlConnectionPoolDataSource,它会重置每个getConnection()上的服务器端状态.值得注意的是,如果重新启动MySQL,自动增量值将返回到堆栈。