2012-04-16 11 views
13

Ponieważ MySQL ignoruje ograniczenia sprawdzające, w jaki sposób można użyć wyzwalacza, aby zatrzymać wstawianie lub aktualizację?Użyj spustu, aby zatrzymać wstawianie lub aktualizację

Na przykład:

Tabela bla posiada atrybut zwany Agencję oraz atrybut agencja może być tylko 1, 2, 3, 4 lub 5.

delimiter $$ 
create trigger agency_check 
before insert on foo 
for each row 
begin 
if (new.agency < 1 or new.agency > 5) then 

#Do nothing? 

end if; 
end 
$$ 
delimiter ; 

też jest lepszy sposób do wykonywania ograniczeń check w MySQL?

+0

Dlaczego nie można użyć kolumny typu "enum' dla agenta? –

Odpowiedz

21

Spróbuj składnię Sygnału - https://dev.mysql.com/doc/refman/5.5/en/signal.html

create trigger agency_check 
before insert on foo 
for each row 
begin 
    if(new.agency < 1 or new.agency >5) then 
    SIGNAL 'your error message' 
    end if 
end 
+11

Nieprawidłowa składnia dla 'SYGNAŁU '. Powinien to być 'SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = 'Twój komunikat o błędzie';' –

4

Jeśli wersja MySQL jest starsza niż 5.5, spróbuj ustawić niezerowym polu tabeli NULL. To jest hak, ale uniemożliwia aktualizację lub wstawianie od ukończenia.

Polecenie SIGNAL, które sugeruje Naveen wygląda świetnie, i nie mogę się doczekać, aby go użyć po aktualizacji.

+2

Napotkałem jedną sytuację, w której ustawienie pola innego niż null nie zapobiegło wstawieniu. To, co działało konsekwentnie dla mnie (w Mysql 5.0 - zanim SIGNAL jest dostępny) jest wywołanie nieistniejącej procedury. [ta odpowiedź] (http://stackoverflow.com/a/1643846/109581) z [longneck] (http://stackoverflow.com/users/94475/longneck) jest tam, gdzie dostałem wskazówkę, aby użyć CALL. – bradoaks

Powiązane problemy