Sprawdzenie prostego Triggera

0

Mam proste dwie tabele:
user image

Chcę zrobić trigger, żeby po wpisie nowego rzędu do tabeli TRASA, automatycznie zapelniał się wpis w tabeli KOSZT, a w polu KOSZT.cena pojawiła się liczba obliczona po wpisaniu pewnych danych. Tabela TRASA zawiera klucz obcy do tabeli SAMOCHOD_OSOBA, ktora zawiera indywidualne zestawienie danej osoby i samochodu. Niestety, zgubiłem się troche :/

CREATE TRIGGER ObliczKoszt BEFORE INSERT ON trasa
FOR EACH ROW 
BEGIN
SET 
@a = (SELECT trasa.km_miasto*osoba_samochod.spalanie_miasto*5.13/100 from trasa, osoba_samochod WHERE trasa.id_osoba_samochod=osoba_samochod.id and trasa.id=NEW.id);
INSERT INTO koszt VALUES(NEW.id, CURDATE(), @a)
END 

wywala błąd:

#1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'INSERT INTO koszt VALUES(NEW.id, CURDATE(), @a) END' at line 6

poza tym nawet nie wiem, czy mój napisany trigger jest choć w 10% dobry...

0

Oczywiście id w koszt masz auto_increment?

CREATE TRIGGER ObliczKoszt BEFORE INSERT ON trasa
FOR EACH ROW 
BEGIN

INSERT INTO koszt (id_trasa, data, cena) -- jawne wymienienie kolumn
VALUES(NEW.id, CURDATE(), (select NEW.km_miasto * spalanie_miasto*5.13/100 from osoba_samochod where id = NEW.id_osoba_samochod))

END 
0

Dziękuję Ci. A jeszcze jedno pytanie - czy w trigerach można stosować składnię IF.... THEN ?
W tabeli osoba_samochod przechowuję enum ('benzyna', 'paliwo', 'gaz'), chciałbym by w zależności od tego wpisu inaczej liczył koszt.

CREATE TRIGGER ObliczKoszt BEFORE INSERT ON trasa

FOR EACH ROW 
BEGIN
 IF osoba_samochod='benzyna' THEN
INSERT INTO koszt (id_trasa, DATA, cena)  kolumn
VALUES(NEW.id, CURDATE(), (SELECT NEW.km_miasto * spalanie_miasto*5.13/100 FROM osoba_samochod WHERE id = NEW.id_osoba_samochod))
ELSEIF osoba_samochod='diesel' THEN  
INSERT INTO koszt (id_trasa, DATA, cena)  kolumn
VALUES(NEW.id, CURDATE(), (SELECT NEW.km_miasto * spalanie_miasto*4.86/100 FROM osoba_samochod WHERE id = NEW.id_osoba_samochod))
ELSEIF osoba_samochod='gaz' THEN
INSERT INTO koszt (id_trasa, DATA, cena)  kolumn
VALUES(NEW.id, CURDATE(), (SELECT NEW.km_miasto * spalanie_miasto*4.20/100 FROM osoba_samochod WHERE id = NEW.id_osoba_samochod))
END  

?

0

Błąd w kodzie powyzej, zamiast "osoba_samochod='diesel'" etc., miało być osoba_samochod.paliwo='diesel' itd.

CREATE TRIGGER ObliczKoszt BEFORE INSERT ON trasa
 
FOR EACH ROW 
BEGIN
 IF osoba_samochod.paliwo='benzyna' THEN
INSERT INTO koszt (id_trasa, DATA, cena)  kolumn
VALUES(NEW.id, CURDATE(), (SELECT NEW.km_miasto * spalanie_miasto*5.13/100 FROM osoba_samochod WHERE id = NEW.id_osoba_samochod))
ELSEIF osoba_samochod.paliwo='diesel' THEN  
INSERT INTO koszt (id_trasa, DATA, cena)  kolumn
VALUES(NEW.id, CURDATE(), (SELECT NEW.km_miasto * spalanie_miasto*4.86/100 FROM osoba_samochod WHERE id = NEW.id_osoba_samochod))
ELSEIF osoba_samochod.paliwo='gaz' THEN
INSERT INTO koszt (id_trasa, DATA, cena)  kolumn
VALUES(NEW.id, CURDATE(), (SELECT NEW.km_miasto * spalanie_miasto*4.20/100 FROM osoba_samochod WHERE id = NEW.id_osoba_samochod))
END  
0

zapoznaj się z konstrukcją case

(
SELECT 
    NEW.km_miasto * spalanie_miasto * (case when paliwo = 'benzyna' then 5.13 
                                                                   when paliwo = 'diesel' then 4.86
                                                                   when paliwo = 'gaz' then 4.20
                                                                   else 5 end
        ) /100 
FROM osoba_samochod WHERE id = NEW.id_osoba_samochod)

1 użytkowników online, w tym zalogowanych: 0, gości: 1