我有一個webapp,我試圖設置一個SQLite數據庫。在這一點上,我建立一個基金會非常簡單。此時只有兩個表格。一個表使用外鍵約束來指向另一個表。我遇到的問題是當我嘗試插入數據時,我總是收到錯誤Error processing SQL: could not execute statement due to a constraint failure (19 constraint failed) -- Code: 6
。顯然,代碼6表示表被鎖定。如果我可以成功地將值插入它,它怎麼能被鎖定?困惑......創建SQLite數據庫並嘗試添加記錄 - 拋出erorrs
我的代碼...
我成立了這個表:
// 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);
});
我甚至沒有注意到那部分是倒退的。但是,在改變順序之後,它仍然沒有改變任何東西。現在,實際上,我收到一個錯誤,說'錯誤處理SQL:無法準備語句(1沒有這樣的列:R1157) - 代碼:5',緊接着原始的約束錯誤。所以,這就像它試圖去做,但不能到達那裏...... – Garfonzo