【问题标题】:Reserving mySQL auto-incremented IDs?保留 mySQL 自动递增的 ID?
【发布时间】:2013-08-27 00:14:26
【问题描述】:

我们希望在其他非mysql相关进程成功完成之前从mySQL获取一个自增ID而不实际存储它,这样如果发生异常或应用程序崩溃,则不会存储该条目。我们需要使用 ID 作为其他进程的键。本质上,我们希望“保留”自动增量并将行插入 mySQL 作为最后一步。在我们知道整个过程已成功完成之前,我们不想插入任何行。

是否可以在 mySQL 中进行这种自动增量保留?

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

【问题讨论】:

  • 你能提供更多细节吗?大意是:(1)一个过程开始。 (2) 数据库发生了一些事情。 (3) 其他事情发生了……等等。
  • 您可能无法使用自动增量。如果您将当前 id 计数器存储在其他地方的小表中,那么当您的外部进程开始时,它可以获取当前 id 并增加它。如果发生崩溃,可能会跳过一个 id,但不会重复。
  • @AldenW。请参阅比尔卡尔文的回复。您认为这是一个好方法吗?

标签: mysql sql transactions auto-increment


【解决方案1】:

您是否考虑过使用 mysql 事务?

它的本质,你开始一个事务,如果所有的sql语句都正确并且可以完成,那么你提交你的事务。如果没有,那么你就像什么都没发生一样回滚。

更多细节可以在这个链接中阅读: http://dev.mysql.com/doc/refman/5.0/en/sql-syntax-transactions.html

【讨论】:

  • 这可能是最好的解决方案(鉴于简短的问题描述,很难确定)。问题发布者应该注意的一个重要细节是事务仅适用于 InnoDB 表。
  • 谢谢。我知道 SQL 事务。但是我们的进程包含需要在数据库之外发生的非 SQL 内容。这些过程可能需要几分钟到几个小时。但我们不希望任何其他进程使用相同的自动增量 ID。这就是为什么我们想要一个“保留”一个自动增量 ID,而不需要真正将任何数据插入数据库。
  • @SaqibAli 您能否详细说明您的问题?看起来有很多事情需要考虑,但描述中没有。
  • Greeso 我在原始问题中添加了一些细节。希望有帮助。看起来@Bill Karwin 的回复可以解决问题。您如何看待这种方法?
【解决方案2】:

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

如果事务完成临时表将消失并将数据移动到真实表

http://www.tutorialspoint.com/mysql/mysql-temporary-tables.htm

【讨论】:

    【解决方案3】:

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

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

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

    【讨论】:

    • 嗨,比尔。这确实是一个有用的回应。听起来正是我们需要的。您以前尝试过这种方法吗?我们应该注意什么?
    • 表的所有其他列要么需要允许 NULL,要么具有默认值。否则,您需要为这些列指定虚拟值。
    • 否,LA​​ST_INSERT_ID() 仅报告 当前 会话中最后生成的 ID。它永远不会报告其他会话生成的 ID。如果它容易受到竞争条件的影响,那么该功能将毫无用处。
    • 使用 com.mysql.jdbc.jdbc2.optional.MysqlConnectionPoolDataSource 并在每个 getConnection() 上重置服务器端状态。
    • 值得注意的是,如果 MySQL 重新启动,自动增量值会返回到堆栈中。
    猜你喜欢
    • 1970-01-01
    • 2014-10-01
    • 2013-01-02
    • 1970-01-01
    • 1970-01-01
    • 2012-12-14
    • 2016-02-19
    • 2010-10-04
    • 2015-03-10
    相关资源
    最近更新 更多