【问题标题】:SQLite Trigger issue - "No such column"SQLite 触发器问题 - “没有这样的列”
【发布时间】:2011-09-30 21:13:39
【问题描述】:

我有一个 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

我收到错误消息“未完成此类列”

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

谢谢。

【问题讨论】:

    标签: triggers sqlite


    【解决方案1】:

    仔细检查您拼写的所有内容是否与数据库中的内容完全一致。在您的示例中,您声明表名称为“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;
    

    【讨论】:

    • 谢谢 - 当我复制它时,它们只是问题中的错字,问题仍然存在
    • 好的,所以我真的看不出出了什么问题——所以采取了有点激烈的行动,完全放弃了触发器和表并重新创建它们——一切都很好,所以肯定是那里的一个愚蠢的错字某处 - 这可能使这成为有史以来最糟糕的 SO 问题之一!
    【解决方案2】:

    通常这将是您正在更新的表中的突变...

    触发器应该只设置类似的值

    new_rec.completed := 1;
    

    不要尝试进行另一次更新。 (请原谅我的 Oracle 语法)

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        猜你喜欢
        • 2014-03-24
        • 1970-01-01
        • 1970-01-01
        • 2015-02-25
        • 2022-01-05
        • 2020-06-02
        • 2019-03-13
        • 2020-08-16
        • 2017-02-09
        相关资源
        最近更新 更多