2011-11-17 79 views
6

我一直在网上搜索如何在sqlite中使用“before trigger”。我知道正确使用“后触发”。我发现那个在数据库发生任何更改(在表中插入/更新行)之前使用“之前触发器”进行验证的人。为了清除表达式,我写了一个触发器,其中的类型在之前,并且在插入之前事件被插入以验证标记。 我的触发器是如何在sqlite插入触发器之前进行验证

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

如果你想提高对无效数据的错误,这样做:

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

感谢您的帮助。但我得到这个错误:没有这样的列标记。 是否由于raise()?你能解释一下关于提升功能吗? 在此先感谢。 – waiyan

+0

'raise'就是你在触发器内产生错误的方式。 http://www.sqlite.org/lang_createtrigger.html –

+0

SELECT语句后,','是必需的。 –

3

如果你想检查标记是否小于或等于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) 
);