如果select返回0行插入数据

时间:2011-10-31 02:57:10

标签: ios database html5 web-sql

我目前有一个尝试将数据插入表中的事务。如果数据已经在表中,则引发约束失败错误并运行select以获取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 个答案:

答案 0 :(得分:0)

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

选择1

选择2

选择3

然后当你提交你的交易时,在第一次调用之后就是这样。

选择2

选择3

插入1

插入2

插入3

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

为了让它成为

SELECT1

insert1

SELECT2

insert2

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