2011-11-17 7 views
6

Szukałem w Internecie, jak używać "przed wyzwalaczem" w sqlite. Wiem poprawnie o użyciu "po wyzwalaczu". Znalazłem ten, który powiedział, że "przed wyzwalaczem" został użyty do sprawdzenia przed zmianami wprowadzonymi do bazy danych (wiersz wstaw/aktualizuj w tabeli). Aby wyczyścić wyrażenie, napisałem wyzwalacz, w którym typ jest wcześniejszy, a zdarzenie wstawiane jest do sprawdzania znaku przed wstawieniem. spust jestSposób sprawdzania z przed wstawić wyzwalacz w sqlite

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

Może to źle spust. Czy mógłbyś wskazać mi błędy? Chcę sprawdzić, czy znak jest mniejszy lub równy 50. Jeśli tak, chcę wstawić wartość domyślną (w tym przypadku 50). Nie jestem zaznajomiony z sql i wyzwalaczem i zaczynam się uczyć.

Mój egzamin tabela ma następujące kolumny,

id(pk) | subject | mark 

Odpowiedz

3

Jeśli chcesz podnieść błąd na nieprawidłowych danych, to zrobić:

CREATE TRIGGER trigger_validate_mark BEFORE INSERT ON exam 
WHEN mark<=50 
BEGIN 
    SELECT RAISE(ABORT,'Mark must be at least 50.'); 
END; 

Jeśli chcesz tylko usunąć dane, to zrobić :

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

dzięki za pomoc. Ale mam ten błąd: brak takiego znaku w kolumnie. Czy to ze względu na raise()? Czy możesz wyjaśnić funkcję podnoszenia? Z góry dziękuję. – waiyan

+0

'Podnieś' to sposób generowania błędu w wyzwalaczu. http://www.sqlite.org/lang_createtrigger.html –

+0

Po instrukcji SELECT wymagane jest ';'. –

3

jeśli chcesz sprawdzić, czy znak jest mniejsza lub równa 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 

Bądź ostrożny jesteś w rachunku when należy określić New.ColumnName

4

Co o zapewnieniu go w definicji tabeli?

CREATE TABLE exam (
    ... 
    CHECK(mark<=50) 
); 
Powiązane problemy