ios - 如果 select 返回 0 行插入数据

标签 ios database html web-sql

我目前有一个尝试将数据插入表中的事务。如果数据已在表中,则会引发约束失败错误并运行选择以获取 ID。

t2.executeSql('INSERT INTO books (book) VALUES (?);',
  [record],
  function (t2, r) {        // SQL_successfulCallback
    record = r.insertId;
  },
  function (t2, err) {      // SQL_errorCallback
    if (err.message !== 'constraint failed') { // insert failed because of other
                                               // reason - fail transaction
      console.log('Insert SQL error ' + err.code + ' - ' + err.message + '.');
      return true;
    } else { // insert failed because data was already in the table
      t2.executeSql('SELECT bookID FROM books WHERE book=?',
        [record],
        function (t, r) {   // SQL_successfulCallback
          record = r.rows.item(0).classificationID;
        },
        function (t, err) { // SQL_errorCallback
          console.log('Lookup SQL error ' + err.code + ' - ' + err.message + '.');
          return true;
        }
      );
      return false;
    }
  }
);

我想加快处理速度,所以我想先看看数据是否在表中。如果不是,则将其插入...

t2.executeSql('SELECT bookID FROM books WHERE book=?',
  [record],
  function (t2, r) {          // SQL_successfulCallback
    if (r.rows.length !== 0) {
      record = r.rows.item(0).bookID;
    } else {
      t2.executeSql('INSERT INTO books (book) VALUES (?);',
        [record],
        function(t2, r){      // SQL_successfulCallbac
          record = r.insertId;
        },
        function (t2, err) {  // SQL_errorCallback
          if (err.message !== 'constraint failed') { // insert failed because of other
                                                     // reason - fail transaction
            console.log('Insert SQL error ' + err.code + ' - ' + err.message + '.');
            return true;
          } else { // insert failed because data was already in the table
            return false;
          }
        }
      );
    }
  },
  function (t, err) {         // SQL_errorCallback
    console.log('Lookup SQL error ' + err.code + ' - ' + err.message + '.');
    return true;
  }
);

...但是它不起作用。此事务运行所有选择然后执行插入。如何使第二种方法起作用?

最佳答案

我假设交易正在排队请求。所以你的队列看起来像这样

选择 1

选择 2

选择 3

然后当您在第一次调用后提交事务时看起来像这样。

选择 2

选择 3

插入 1

插入 2

插入 3

发生这种情况是因为调用插入的函数在选择运行后执行,并且直到事务提交但选择已经注册时才会发生。

为了让它成为

选择1

插入1

选择2

插入2

我会为每个选择语句创建一个单独的事务。

关于ios - 如果 select 返回 0 行插入数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7949588/

相关文章:

mysql - 显示从属主机;有一个空的主机输出。如何获取从属主机?

javascript - Angular:使用单个变量进行多个按钮操作

ios - Ionic 1 WkWebView iOS - 无法加载资源 : Origin ionic://localhost is not allowed by Access-Control-Allow

ios - 如何使 UIStackView 元素居中对齐

java - Sqlite - 降级

javascript - 如何将字符串列表从 flask python main 函数传递给 html 中的 javascript?

html - 如何使带有背景附件的图像居中

ios - UITableView 在快速填充标签时跳过所有其他单元格

ios - pow(10, x) 在 iOS 6 上崩溃

java - 在开发中为 gae 应用程序抓取数据并将其上传到 prod 还是应该在 prod 中抓取更容易?