【问题标题】:How to insert and retrieve at the same time in MySQL如何在 MySQL 中同时插入和检索
【发布时间】:2014-08-22 04:29:31
【问题描述】:

我有一个名为Domain_Test 的表,列是:-

  1. 身份证
  2. 已处理

这里IDauto incrementDomain 包含链接,processed 包含0。基本上我需要一个查询,通过它我可以检索domain,同时需要更新processed 列到 1. 而我正在使用 java 来完成这一切。

【问题讨论】:

  • @MadProgrammer,我不明白你。请描述一点..
  • 为什么需要在一份声明中做到这一点?
  • @Lennart,如果在一个声明中可能,那么请告诉我其他方法。
  • 不可能。您不能在单个语句中执行此操作。虽然您可以设置一系列似乎同时发生的语句
  • 我不确定问题出在哪里,听起来很简单。使用事务,先检索域,然后更新状态

标签: java mysql sql jdbc


【解决方案1】:

据我所知,这是不可能的。我假设您想在单个语句中执行此操作的原因是确保不会在您的两个语句之间更新记录。

您需要做的是使用事务。在事务内部,首先进行更新,然后进行选择。然后你提交事务。事务的原子性保证你读取的域的值和你设置处理标志时的值是一样的。

START TRANSACTION;
UPDATE Domain_Test SET processed=1 WHERE id=YourId
SELECT Doman FROM Domain_Test WHERE id=YourId
COMMIT;

有关 mysql 中事务的更多信息,请参阅http://dev.mysql.com/doc/refman/5.0/en/commit.html

【讨论】:

    【解决方案2】:

    你不能在一个语句中retrieveupdate,有两个步骤

    select domain from thatTable where id = 100 -- retrieve the value in domain
    

    更新:

    update thatTable     set processed = NOW()     where id = 100
    

    【讨论】:

      【解决方案3】:

      试试这个,

      public static int retrieveAndUpdate(Connection connection) throws SQLException{
          try {
              connection.setAutoCommit(false);
      
              String querySelect = "SELECT processed FROM Domain_Test WHERE id=YourId";
              String queryUpdate = "UPDATE Domain_Test SET processed=? WHERE id=YourId";
      
              PreparedStatement preparedStatement = connection.prepareStatement(queryUpdate);
      
              ResultSet resultSet = connection.createStatement().executeQuery(querySelect);
      
              if (!resultSet.next()) {
                  return 0;
              } else { // This block is running, if the query is retrieved some data
                  while (resultSet.next()) {
                      preparedStatement.setInt(1, 1);
                      preparedStatement.addBatch();
                  }
                  int[] batchUpdate = preparedStatement.executeBatch();
                  for (int result : batchUpdate) {
                      if (result == 0) {
                          connection.rollback();// When update process gets an error, stop the current process.
                          return 0;
                      }
                  }
              }
              connection.commit(); //If Retrieving and Updating is success, data will be commited to the DB
              return 1;
      
          } catch (SQLException ex) {
              connection.rollback(); // // When update process gets SQLException, current process will be stopped.
              throw ex;
      
          }
      }
      

      如果所有进程都成功,这会将您的数据提交到数据库。

      【讨论】:

        猜你喜欢
        • 2015-05-14
        • 1970-01-01
        • 2012-08-30
        • 2023-03-09
        • 2013-11-29
        • 1970-01-01
        • 2015-06-02
        • 2012-06-09
        • 1970-01-01
        相关资源
        最近更新 更多