1

我在 Google Gears (Sqlite) 中创建了一个表:

db.execute('create table if not exists SPALINKS (link_id int PRIMARY KEY, sid1 int, sid2 int, label text, user text, Timestamp int');

使用 Google Gears 数据库查询工具(在 FF 中)时,带有“last-insert-rowid”的 INSERT 可以正常工作。只要我不使用“last-insert-rowid”,来自 Javascript 的插入就可以正常工作。但是当使用'last-insert-rowid'时它不再起作用了:

    var sql_stmt = 'INSERT INTO SPALINKS (link_id, sid1, sid2, label, user, Timestamp) VALUES (last_insert_rowid(),?,?,?,?,?)';
var arg_array = [sid1, sid2, label, user, creation_time];
db.execute(sql_stmt, arg_array);

Error: Database operation failed. ERROR: constraint failed DETAILS: constraint failed

为什么 SQLite 的“last-insert-rowid”可以在 DB 工具中正常工作,但不能在从 Javascript 函数内部创建和执行的 SQL 语句中工作?

4

2 回答 2

0

似乎问题在于相应的列未定义为AUTOINCREMENT。

于 2009-08-22T14:26:45.813 回答
0

我认为你不必last_insert_rowid()在那种情况下使用。为什么只是制作INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT.

// if you writing for android and you have something like this:
//document.addEventListener("deviceready", onDeviceReady, false);
//function onDeviceReady(){
// make sure you comment it if you debugging in browser

// connection to the databse
var db = window.openDatabase("demo.db", "1.0", "Demo Database", 200000);

// There is problem with SQLite recognize new Date() format so I include http://code.google.com/p/datejs/ library in my project and format the date to be recognizable by SQLite

function nowTime(){
        return new Date().toString("yyyy-MM-dd HH:mm:ss");
    }

function errorCallBack(err) {
            alert("Error processing SQL: " + err.code);
        }
function callBack(){

    function readTransactionError(err){
        alert('Read Transaction Error: ' + err);
    }

// you can make your vars global if you want to use them out side of function!!!

    function querySuccess(tx, results) {
       var len = results.rows.length;
        for(var i = 0; i < len; i++) {
           var sid1Var = results.rows.item(i).sid1;
           var sid2Var = results.rows.item(i).sid2;
           var labelVar = results.rows.item(i).label;
           var userNameVar = results.rows.item(i).userName;
           var timeStampVar = results.rows.item(i).timeStamp;
    }
  }

tx.readTransaction('select * from SPALINKS;', [], querySuccess, readTransactionError);
}
function functionName(sid1, sid2, label, userName) {
    db.transaction(function(tx) {
        db.executeSql('create table if not exists SPALINKS (link_id int INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT, sid1, sid2, label, userName, timeStamp');

        db.executeSql('insert into SPALINKS (sid1, sid2, label, userName, timeStamp) VALUES (?, ?, ?, ?, ?)', [sid1, sid2, label, userName, nowTime()], callBack, errorCallBack);
    });
}
// assuming you use jQuery
$('#selectorID').click(function(){
functionName(sid1, sid2, label, userName);
});

You can use last_insert_rowid() in situation like UPDATE:

function updateFunction() {
db.transaction(function(tx) {
    tx.executeSql('update SPALINKS set timeStamp = "' + nowTime() + '" WHERE link_id = last_insert_rowid()');
});
}

I hope this is going to work.

于 2012-02-27T21:04:59.953 回答