【问题标题】:SQLite - Converting MySQL trigger to work on SQLiteSQLite - 将 MySQL 触发器转换为在 SQLite 上工作
【发布时间】:2021-12-18 09:00:17
【问题描述】:

我刚开始学习 SQLite 课程,我的一项任务希望我为 SQLite 数据库创建触发器。我知道 MySQL 中的某些函数不能像 IF 语句一样在 SQLite 上运行。谁能帮我把这个 MySQL 触发器代码转换为在 SQLite 上工作?

这是 MySQL 中的触发代码:(此代码已经过测试,可与 MySQL 中的同一数据库一起使用)

CREATE TRIGGER `grade_update_check` 
BEFORE UPDATE ON `highschooler`
 FOR EACH ROW BEGIN
IF (NEW.GRADE > 12) 
THEN SET NEW.GRADE = OLD.GRADE;
 END IF;
 IF (NEW.GRADE < 9) 
THEN SET NEW.GRADE = OLD.GRADE;
 END IF; 
IF (SELECT COUNT(ID) FROM highschooler WHERE name = NEW.name and grade = NEW.grade) = 1 
THEN SET NEW.GRADE = OLD.GRADE; 
END IF; 
END

这是我为同一个触发器转换的 SQLite 代码:

CREATE TRIGGER 'grade_update_check' BEFORE UPDATE ON 'Highschooler' 
BEGIN
SELECT CASE
WHEN (SELECT grade FROM Highschooler WHERE NEW.GRADE > 12) THEN SET NEW.GRADE = OLD.GRADE;
WHEN (SELECT grade FROM Highschooler WHERE NEW.GRADE < 9) THEN SET NEW.GRADE = OLD.GRADE;
WHEN ((SELECT COUNT(ID) FROM highschooler WHERE name = NEW.name and grade = NEW.grade) = 1) THEN SET NEW.GRADE = OLD.GRADE;
END;
END;

当我尝试执行它时,它会抛出 Error: near "SET": syntax error 的错误。

任何帮助或建议都非常感谢!

【问题讨论】:

    标签: mysql sqlite


    【解决方案1】:

    如果满足 3 个条件中的任何一个,您希望触发器中止更新操作。

    这可以像这样在 SQLite 中完成:

    CREATE TRIGGER grade_update_check BEFORE UPDATE ON Highschooler 
    BEGIN
      SELECT 
        CASE
          WHEN NEW.GRADE < 9 OR NEW.GRADE > 12
            OR ((SELECT COUNT(ID) FROM highschooler WHERE name = NEW.name and grade = NEW.grade) = 1) 
          THEN RAISE(ABORT, 'your message here')
        END;
    END;
    

    函数RAISE(ABORT, ...) 将中止操作并且不会更新行。
    您可以自定义您将收到的消息,或将其留空。

    【讨论】:

    • 如何实现SET NEW.GRADE = OLD.GRADE
    • @kimmieRak2 我不知道。 SET NEW.GRADE = OLD.GRADE 所做的是保留当前值而不更新列。这是由 RAISE(ABORT, ..) 完成的,它会中止更新。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-04-22
    • 2013-04-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多