2011-11-17 20 views
6

Ho cercato sul Web come utilizzare "before trigger" in sqlite. Conosco correttamente l'uso di "after trigger". Ho trovato quello che diceva che "before trigger" è stato usato per validare prima di ogni modifica apportata al database (riga insert/updat nella tabella). Per cancellare l'espressione, ho scritto un trigger in cui il tipo è prima e l'evento è inserito per validare il segno prima di inserirlo. mio trigger èCome convalidare prima del trigger di inserimento in sqlite

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

forse è grilletto sbagliato. Quindi, potresti indicarmi gli errori? Voglio controllare se è inferiore o uguale a 50. Se è così, voglio inserire il valore di default (in questo caso, 50). Non ho molta familiarità con SQL e trigger e sto iniziando a imparare.

Il mio tavolo esame ha seguenti colonne,

id(pk) | subject | mark 

risposta

3

Se si vuole generare un errore su dati non validi, fare questo:

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

Se si desidera solo per correggere i dati, fare questo :

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

grazie per il vostro aiuto. Ma ho ricevuto questo errore: nessun segno di colonna di questo tipo. È dovuto a raise()? Puoi spiegare la funzione di sollevamento? Grazie in anticipo. – waiyan

+0

'raise' è come si genera un errore all'interno di un trigger. http://www.sqlite.org/lang_createtrigger.html –

+0

Dopo l'istruzione SELECT, ';' è richiesto. –

3

se si desidera controllare il segno se è minore o uguale a 50

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

Siate attenti nella dichiarazione when è necessario specificare New.ColumnName

4

Che dire assicurandosi che nella definizione della tabella?

CREATE TABLE exam (
    ... 
    CHECK(mark<=50) 
); 
Problemi correlati