如何在sqlite中使用before insert触发器进行验证

6

我一直在网上搜索如何在sqlite中使用“before trigger”。我对使用“after trigger”非常熟悉。我找到了一个说“before trigger”用于在对数据库进行任何更改(在表中插入/更新行)之前进行验证的。为了清楚表达,我编写了一个触发器,类型为before,事件为insert,以验证插入前的标记。

create trigger mark_insert before insert on exam
when mark<=50
begin
insert into exam(mark) values(50);
end; 

也许是错误的触发器。所以,您能否指出其中的错误?我想检查标记是否小于或等于50。如果是这样,我想插入默认值(在这种情况下为50)。我对SQL和触发器不是很熟悉,正在开始学习。
我的考试表有以下列:
id(pk) | subject | mark
3个回答

5
如果您想在数据无效时引发错误,请执行以下操作:
CREATE TRIGGER trigger_validate_mark BEFORE INSERT ON exam
WHEN mark<=50
BEGIN
  SELECT RAISE(ABORT,'Mark must be at least 50.');
END;

如果您只是想修复数据,请按照以下步骤操作:
CREATE TRIGGER trigger_min_mark AFTER INSERT ON exam
WHEN mark<=50
BEGIN
  UPDATE exam
  SET mark=50
  WHERE id = new.id;
END;

1
感谢您的帮助。但是我遇到了这个错误:没有名为“mark”的列。这是由于raise()函数引起的吗?您能解释一下raise函数吗?提前致谢。 - waiyan
raise 是在触发器中生成错误的方式。http://www.sqlite.org/lang_createtrigger.html - Jeremy Stein
在SELECT语句之后,需要加上; - ABu

4

如果您想检查分数是否小于或等于50分

CREATE TRIGGER trigger_min_mark AFTER INSERT ON exam
WHEN New.mark<=50
BEGIN
  UPDATE exam SET mark=50 WHERE id = New.id;
END

注意,在when语句中,您必须指定New.ColumnName


4
在表定义中保证它怎么样?
CREATE TABLE exam (
  ...
  CHECK(mark<=50)
);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接