SQLite触发器问题 - “没有这样的列”

时间:2011-09-30 21:13:39

标签: triggers sqlite

我有一个带有名为Achievements的表的sqlite数据库,它存储了我正在构建的简单测验中是否满足某些成就(iphone项目学习objective-c)。表结构是:

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

ID是主键,Name是VARCHAR,Completed是BOOL(0表示false,1表示true)。

我正在尝试在此表的更新语句中添加一个触发器,这样当一个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';

所以我想要做的是获取已完成行的总和并将其与总计数减去1进行比较,如果它们匹配则表示除了AllCompleted成就之外的所有成就都已实现,因此我们也可以设置为真。触发器被创建好了。

现在问题 - 当我尝试使用以下语句更新表时

UPDATE Achievements SET Completed = 1 WHERE ID = 1

我收到错误消息“没有这样的列已完成”

我是否尝试做一些根本错误的事情?我不可能使用触发器实现这一目标吗?有什么建议吗?

感谢。

3 个答案:

答案 0 :(得分:0)

通常这会是您正在更新的表中的变异......

触发器应该只设置类似

的值
new_rec.completed := 1;

不要尝试进行其他更新。 (借口我的Oracle语法)

答案 1 :(得分:0)

我认为你不应该在更新该表时从触发器更新表,可能是无限递归。也许SQLite不喜欢这样,但是给出一个糟糕的诊断

答案 2 :(得分:0)

仔细检查您拼写的所有内容与数据库中的完全相同。在您的示例中,您声明表名称为“Achievements”,但在两个地方引用“Achievement”。

修复应解决您的问题。最终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;