【问题标题】:Can I SELECT with LAST_INSERT_ID() after INSERT Batch without any cares?我可以在 INSERT Batch 之后使用 LAST_INSERT_ID() 选择而不需要任何关心吗?
【发布时间】:2012-11-02 01:06:36
【问题描述】:

我在问自己,在一批INSERTs 之后,是否可以在WHERE 子句中使用SELECTLAST_INSERT_ID() 而不会在表中获得损坏的数据?我正在考虑多个用户同时做同样事情的场景。我开发了一个 JSF 应用程序,在该应用程序中可以实现这种情况。

在硬代码中,INSERTs 之后的 SELECT 如下所示:

preparedstatement.addBatch(
              "INSERT INTO table1(all the FIELDS)"
              + "VALUES(null, ...);"
      );

      preparedstatement.addBatch(
              "INSERT INTO table2(all the FIELDS)"
              + "VALUES(null, LAST_INSERT_ID(), ...);"          
      );


      preparedstatement = connect.prepareStatement(

              "SELECT id FROM table3 WHERE id = LAST_INSERT_ID();"

      );

      preparedstatement.executeBatch();
      resultSet = preparedstatement.executeQuery();

在这个实现中遇到问题还是有更好的方法?

最好的问候

【问题讨论】:

  • 我在此页面上看到的唯一内容是从 connect.preparedStatement() 获取密钥,但在我的情况下,我需要从批处理中获取密钥。
  • 对不起,我误解了你的问题......请看下面的答案

标签: java mysql jdbc


【解决方案1】:

你应该没问题,引用 MySQL 的文档:

生成的 ID 保存在服务器上的 基于每个连接。这意味着返回的值 给定客户端的函数是生成的第一个 AUTO_INCREMENT 值 对于影响 AUTO_INCREMENT 列的最新语句 客户。此值不会受到其他客户端的影响,即使它们 生成自己的 AUTO_INCREMENT 值。这种行为确保 每个客户端都可以检索自己的 ID 而无需担心 其他客户端的活动,并且不需要锁或 交易。

MySQL Last_insert_id

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多