我有一个带有名为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
我收到错误消息“没有这样的列已完成”。
我是否尝试做一些根本错误的事情?我不可能使用触发器实现这一目标吗?有什么建议吗?
感谢。
答案 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;