我有一个webapp,我试图建立一个SQLite数据库。在这一点上,我建立一个基础非常简单。此时只有两张桌子。一个表使用外键约束指向另一个表。我遇到的问题是当我尝试插入数据时,我总是收到错误Error processing SQL: could not execute statement due to a constraint failure (19 constraint failed) -- Code: 6
。显然,代码6意味着表被锁定。如果我可以成功地将值插入其中,如何锁定?困惑...
我的代码......
我用这个来设置表格:
// Create a system table, if it doesn't exist
db.transaction(function(tx){
tx.executeSql('CREATE TABLE IF NOT EXISTS system(systemID TEXT PRIMARY KEY, numZones INT NULL, numHeads INT NULL)', [],nullHandler,errorHandler);
},errorHandler, successCallBack);
// Create a work order table, if it doesn't exist
db.transaction(function(tx){
tx.executeSql('CREATE TABLE IF NOT EXISTS wo(woID_id TEXT PRIMARY KEY, woType TEXT NOT NULL, systemID_fk TEXT NOT NULL, FOREIGN KEY (systemID_fk) REFERENCES system(systemID))', [],nullHandler,errorHandler);
},errorHandler, successCallBack);
据推测,现在我将有两个表,一个有一个指向另一个表的字段。我正在引入一个JSon提要,解析它,并尝试将它放入这两个表中。这是解析的代码:
function GetSystems(){
// First we see if there are credentials stored. If not, we don't try to retrieve the work orders.
db.transaction(function(transaction){
transaction.executeSql('SELECT * FROM Creds;',[], function(transaction, result) {
// If the user hasn't entered their creds yet, we create a new record, otherwise update the current one.
if(result.rows.length != 0){
var row;
db.transaction(function(transaction){
transaction.executeSql('SELECT * FROM Creds where id=1;',[],function(transaction, result) {
$.getJSON(baseURL + "get-wos/?callback=?", { username:result.rows.item(0).username, password:result.rows.item(0).password }, function(data) {
$.each(data, function(i, obj) {
db.transaction(function(transaction){
transaction.executeSql('INSERT INTO system(systemID, numZones, numHeads) VALUES (?, null, null)', [obj.systemID], nullHandler, errorHandler);
transaction.executeSql('INSERT INTO wo (woID, woType, systemID_fk) ' +
'VALUES ((SELECT systemID FROM system WHERE systemID = ' + obj.systemID + '), ?, ?)',
[obj.woID, obj.woType], nullHandler, errorHandler);
})
});
});
});
});
}
});
});
}
当我运行上面的代码时,systems
已正确加载但wos
未正确加载。我对这个问题的研究告诉我,我可能会遇到一些问题。一个建议是表中可能已有数据。我通过使用drop tables
函数完全清除数据库来解决这个问题(我使用Chrome开发工具来调查数据库)。
所以真的,我不确定我做错了什么。我的语法是否因插入外键约束而不正确?
解决
我偶然发现了this线程,@ havexz提到插入中的变量并没有引用它。我看着我的,它有同样的问题。这是我编辑的插件,用于添加带外键的记录。请注意systemID='"
而不是原始版systemID="
。我错过了变量周围的单引号。
db.transaction(function(transaction){
transaction.executeSql("INSERT INTO wo (woID, woType, systemID_fk) " +
"VALUES (?, ?, (SELECT systemID FROM system WHERE systemID='" + obj.systemID + "'))", [obj.woID, obj.woType], nullHandler, errorHandler);
});
答案 0 :(得分:0)
INSERT wo
的参数顺序是否正确?看起来您将systemID
放入woID
字段而不是systemID_fk
有约束。应该是:
transaction.executeSql('INSERT INTO wo (woID, woType, systemID_fk) ' +
'VALUES (?, ?, (SELECT systemID FROM system WHERE systemID = ' + obj.systemID + '))',
[obj.woID, obj.woType], nullHandler, errorHandler);