2011-09-30 22 views
0

我有一個名爲Achievements的表的sqlite數據庫,它存儲是否在我正在構建的一個簡單測驗中遇到某些成就(iphone項目學習objective-c)。表結構是:SQLite觸發問題 - 「沒有這樣的列」

ID Name   Completed 
============================= 
1  FiveInARow  0 
2  TenInARow  0 
3  AllCorrect  0 
4  UnderASecond 0 
5  AllCompleted 0 

的ID是主鍵,名稱是VARCHAR的和完成的是(對於假0和1爲真)BOOL。

我試圖在此表的更新語句中添加一個觸發器,以便當Completed列設置爲1(即完成的成就 - 這是將在表上發生的唯一更新)時,會有一個計算,看看是否所有其他的成就已經完成,如果是的話也更新AllCompleted成就(ID 5)爲1

我創建的觸發是:
CREATE TRIGGER "checkAllAchievements" AFTER UPDATE ON "Achievements"
WHEN (Select SUM(Completed) from Achievements) = (Select COUNT(Completed) -1 from Achievements)
BEGIN UPDATE Achievements SET Completed = 1 WHERE Name= 'AllCompleted';

那麼,我想do是將已完成的行的總和與總計數減1相比較,如果它們匹配,則意味着除了所有的成就從AllCompleted中取得的成就已經實現,所以我們也可以將其設置爲true。觸發器創建正常。

現在到這個問題 - 當我嘗試用下面的語句

UPDATE Achievements SET Completed = 1 WHERE ID = 1

更新表我收到錯誤消息「完成沒有這樣的列」。

我想做一些根本性錯誤的事情嗎?使用觸發器不能實現這一點?有什麼建議?

謝謝。

回答

0

仔細檢查你拼寫的一切,就像它在數據庫中一樣。在你的例子中,你聲明表名是「成就」,但是在兩個地方引用「成就」。

修復應該解決您的問題。最終的SQL如下:

CREATE TRIGGER "checkAllAchievements" 
AFTER UPDATE ON Achievements 
WHEN (SELECT SUM(Completed) FROM Achievements) = (SELECT COUNT(Completed)-1 FROM Achievements) 
BEGIN 
    UPDATE Achievements SET Completed=1 WHERE Name='AllCompleted'; 
END; 
+0

感謝 - 他們只是錯字的問題中,而我被複製出來,這個問題依然存在 – MattStacey

+0

嗯,絕對奇怪 - 這個解決方案的工作我的系統上 –

+0

行,所以我真的couldn沒有看到發生了什麼問題 - 所以採取了徹底放棄觸發器和表格並重新創建它們的激烈行動 - 所有工作都很好,所以一定是在某處出現了一個愚蠢的錯字 - 這可能會成爲有史以來最糟糕的SO問題之一! – MattStacey

0

通常這將是你正在更新的表中的突變......

觸發應該只是設置的值類似

new_rec.completed := 1; 

不試着去做另一個更新。 (原諒我的Oracle語法)

0

我認爲你不應該更新表的觸發器更新表,可能是一個無限遞歸。也許SQLite不喜歡那樣,但給一個壞的診斷