2011-11-17 76 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) 
);