将已验证可用的MySQL触发器转换为SQLite可执行语法的问题咨询
错误原因
你遇到的语法错误由SQLite和MySQL的触发器语法差异导致,核心问题有两个:
- SQLite不支持在CASE表达式内嵌入
SET语句,所有数据修改操作必须作为独立的执行语句存在 - 你不需要通过额外
SELECT查询获取NEW的字段值,NEW是触发器上下文自带的当前行待更新数据变量,可直接读取判断
修正后的SQLite触发器代码
CREATE TRIGGER grade_update_check BEFORE UPDATE ON highschooler FOR EACH ROW BEGIN -- 年级大于12时回退为原值 UPDATE highschooler SET grade = OLD.grade WHERE id = NEW.id AND NEW.grade > 12; -- 年级小于9时回退为原值 UPDATE highschooler SET grade = OLD.grade WHERE id = NEW.id AND NEW.grade < 9; -- 同姓名同年级已存在记录时回退为原值 UPDATE highschooler SET grade = OLD.grade WHERE id = NEW.id AND (SELECT COUNT(ID) FROM highschooler WHERE name = NEW.name AND grade = NEW.grade) = 1; END;
注意事项
- SQLite的标识符(表名、触发器名)不要用单引号包裹,单引号是字符串的边界,标识符如果需要转义用双引号或者反引号即可
- 上述代码逻辑和你提供的MySQL触发器逻辑完全一致,已适配SQLite语法规则,执行后即可实现相同的校验效果
内容的提问来源于stack exchange,提问作者kimmieRak2
相关产品推荐
相关产品推荐

